我正在尝试编写一个对粒子进行一些基本重力物理模拟的程序.最初,我使用标准JavaScript图形(带有2D上下文)编写了该程序,并且可以以这种方式获得大约25 fps w/10000粒子.我在WebGL中重写了该工具,因为我的假设是我可以以这种方式获得更好的结果.我还使用Glmatrix库进行矢量数学.但是,通过此实现,我只能获得约15fps的10000个粒子. 我目前是EEC本科生,我拥有合理的经验编程,但从未使用图形,我对如何优化JavaScript代码几乎没有任何线索. 关于WebGL和JavaScript如何工作,我不了解很多.使用这些技术时,哪些关键组件会影响性能?是否有更有效的数据结构用于管理我的粒子(我只是在使用简单的数组)?使用WebGL的性能下降可以有什么解释? GPU和JavaScript之间的延迟可能? 一般而言,任何建议,解释或帮助都将不胜感激. 我将尝试仅包括我的代码的关键区域以供参考. 这是我的设置代码: gl = null; t
以下是关于 particles 的编程技术问答
如何正确播放粒子系统组件,该组件附加到游戏对象上?我还将以下脚本附加到我的游戏对象上,但是粒子系统不播放.我该如何解决? public Transform gameobject1; public Transform gameobject2; public ParticleSystem particules; void Start() { float distance = Vector3.Distance(gameobject1.position, gameobject2.position); } void Update() { if(distance == 20) { particules.Play(); } } 解决方案 我看不到您在班级中声明距离,但是您在更新下使用它.将距离声明为私人浮子,并与其他成员一起将其定义. 假设您的代码不完全如此,您的问题也似乎源于使用距离的固体值.尝试使用少于或等于20. if(distan
我想在由其(Minx,Miny,Minz)和(MaxX,Maxy,Maxz)角定义的3D框上生成随机点.我当时想在盒子里产生一个随机点,然后以某种方式将其投影到一个盒子的侧面.但是,我没有针对盒子侧的明确平面信息,这似乎不会产生统一的点分布,因为如果盒子的某些侧面比其他方面大,那么这些侧面应该在它们上产生更多的点. 任何建议都将受到赞赏. 谢谢. 解决方案 在随机中是区域(备用链接或这个 ...) 放置一个从该侧的均匀分布中随机选择的点 泡沫,冲洗,重复. 或交替 决定点的密度 依次填充每一侧,随机集有该密度 更均匀的(即较少随机),但只要密度足够高以至于每一侧都具有少数点
我希望在圆柱和圆锥体上随机和均匀生成点(分别).气缸由其中心,半径和高度定义.锥体的规格相同.我能够为每种形状提供边界框,因此我正在考虑在边界框中生成点.但是,我不确定如何将它们投影到圆柱/锥体上,或者这是最好的主意. 有什么建议? 谢谢. 解决方案 圆柱体的情况是微不足道的.如果半径r> 0和高度H> 0的圆柱是(x,y,z)=(rcosφ,rsinφ,z)的图像,上/2,h/2],然后只需在这些间隔上随机选择φ和z即可.当然,一个人可以使用标准参数化也可以简单地参数化锥体,但是该区域元素在参数平面上不会恒定,因此点的分布不会随机.因此,您需要找到不同的参数化.我已经在其他解决方案 一种想到这一点的方法是,圆柱体和锥体都可以拆开成平坦的表面 - 只需从顶部到底部的直线切割每一条即可. 圆柱体将矩形拆开(如果您包括顶部和底部,请添加几个磁盘). 圆锥形将圆形底部的三角形拆开,即圆的弧线(如果包括圆锥的底部,请添加磁盘). 很容易将这些平面表面嵌入矩
我想在1D轨迹的所有时间计算均方根位移.我是新手程序员,所以我尝试了模拟的随机步行. import numpy as np import matplotlib.pyplot as plt # generate random walk path = np.zeros(60) position = 0 for i in range(1, path.size): move = np.random.randint(0, 2) if move == 0: position += -1 else: position += 1 path[i] = position # returns a vector of MSDs from a given path def calcMSD(data): msd = np.zeros(data.size - 1) for i in range(1, data.size): squareddis
我一直在使用Alpha,来自Photoshop的Alpha使用24bit .png,并且只是尝试了一个.psd,它与OpenGl ES一起使用,但金属没有看到Alpha频道. 场景中粒子的绝对性能最大的纹理格式是什么? 这是一张需要测试的工作表,如果需要. 它看起来为白色...右键单击并保存在空白空间中.这是一组alpha的戒指.如果您在屏幕上斜视,您可能几乎无法将它们弄出: 夸张的例子用例: Cickless.mov?dl = 0 //任何人的其他点可以猜测视频中的左环和右环之间的区别. 解决方案 使用灰度/alpha png,而不是RGBA.由于它使用每个像素(8+8)而不是32(8+8+8+8)的16位,因此初始纹理负载将更快,并且可能(取决于GPU)也使用较少的内存.不过,在渲染时间,您不会看到太大的速度差异,因为无论哪种纹理格式仍在吸引到完整的RGB(a)渲染缓冲区. 还有PVRTC,可以使您下降至每个像素的低至2-4位,但我尝
这个问题在以下问题上: three 3.js-几何颗粒,需要在系统中对粒子的随机组进行动画 如何快速更新大型缓冲测序? 我正在启动一个新项目,该项目随时都会在现场中有数万个粒子.这个概念是,将会有许多粒子簇看起来像星系散布在整个场景中.有时,我需要动画银河系及其成千上万个颗粒.我可以在几何形状仍在缓冲区内时这样做吗? 我使用的是使用THREE.BufferGeometry构建的PointCloud,每个顶点位置都使用Float32Array( numParticles * 3 ). . 过去,我一直使用 解决方案 如果您想对数万个粒子进行动画动画,请在GPU上执行模拟,并在顶点着色器中取代颗粒的位置.您可以Google的流行语是" GPGPU". 您有很多选择:逻辑可以完全在着色器中,并且/或者您可以将更新的控件制服传递给着色器,并且/或您可以将属性传递给着色器. 这是一个三./a> 这是一个使用粒子的示例:三人r.69
我是三分的新手,正在尝试找出添加1000个粒子的最佳方法,每个粒子的大小和颜色不同.每个粒子的纹理都是通过画画布来创建的.通过使用颗粒系统,所有颗粒的颜色和大小都是相同的.为每个粒子创建一个特定系统非常低效.是否有一种有效的方法来处理此操作? 解决方案 根据我的经验,最好的方法是创建一种自定义的着色器材料.然后,您可以包含属性,这些属性是粒子之间因粒子而异的属性.您的着色器代码看起来像这样: 顶点着色器: attribute vec3 customColor; attribute float customSize; varying vec3 vColor; void main() { vColor = customColor; // set color associated to vertex; use later in fragment shader vec4 mvPosition = modelViewMatrix * vec4( positio
我正在尝试沿着类似于这种镀铬的挖掘的路径来动画粒子:/ 我已经尝试挖掘该项目的来源,到目前为止,我已经使用了内置的曲线方法.getPoitns()在其行上生成约30分. 我想完成的工作有更好的例子吗?是否有一种方法可以比使用30次获得30分的方法来获取点上的点?我应该只使用补间动画吗? 任何帮助或方向都将不胜感激. 解决方案 我已经找到了一个解决方案,不确定它是最好的,但是效果很好. 您可以在JSFIDDLE上找到一个演示: //First create the line that we want to animate the particles along var geometry = new THREE.Geometry(); geometry.vertices.push(new THREE.Vector3(-800, 0, -800)); geometry.vertices.push(new THREE.Vector3(800, 0, 0
我回来了.这次想知道如何将不透明度从0更改为1,然后在距离发射器的某些像素距离内返回. var particleCount = 14, particles = new THREE.Geometry(), pMaterial = new THREE.PointsMaterial({ map: new THREE.TextureLoader().load("x.png"), blending: THREE.multiplyBlending, flatShading: true, size: 40, transparent: true, depthTest: true, sizeAttenuation: true, opacity: 1 }); var particleSystem; 我的主要混乱是,即使我给出了透明度,我也无法更改我为发射器制作的更新comp中的值. function update() { //particleSystem.r
我已经在许多网站上看到了粒子散射效应,以及在运输中的应用设计概念.效果就是这样: - 效果也可以看到如下所示: - https://dribbble.com/shots/3511585-hello-dribbble > 我们如何在iOS应用程序中实现这种效果? 解决方案 如果您正在寻找简单的东西,请查看CAEmitterLayer和CAEmitterCell.只需用kCAEmitterLayerRectangle的emitterShape做一个CAEmitterLayer,就可以用另一个CAShapeLayer裁剪它以获得所需的形状: 这是一个生成类似上述内容的样本: override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // define emitter layer as centered w 80% of smallest dimension
我只是好奇,有没有一种方法可以放缓沿场景中其他物体发射的粒子.假设您有一个粒子发射极和一个精灵.使用SKAction移动精灵.发射极正在散发.两个节点都添加到场景中.如果将self.speed设置为0.5,则只有精灵会放慢速度.发射器将继续以相同的速度发射. 除了使用pracelespeed属性以外,还有其他方法可以减速,因为这将改变发射极的行为. 我的问题的灵感来自这个问题: https://stackoverflow.com/a/a/41764180/34002095 P> 解决方案 通常A SKEmitterNode在其速度中涉及许多属性(xAcceleration,yAcceleration,particleSpeedRange,particleSpeedRange,particleScaleSpeed ..): private func newExplosion() -> SKEmitterNode { let explosion = SK
我已经尝试了几次解决方法,但是我仍然无法在iOS9上暂停现有的粒子.我正在使用以下技术来暂停场景: 用self.paused = YES; 暂停场景 设置自定义globalPause = YES;变量控制update:方法执行(因为update:在暂停场景时仍在运行). 关键是我不暂停视图,而是场景.我不暂停视图,因为 this . 这是可以在iOS9上重现此问题的代码: #import "GameScene.h" @interface GameScene () @property (nonatomic, strong)SKEmitterNode *emitter; @end @implementation GameScene -(void)didMoveToView:(SKView *)view { [self addChild:[self getSpaceDustEmitter]]; } //No need for this me
我目前正在尝试进行一个模拟,其中多种粒子代理(蓝色点)尝试跟随敌方粒子(红点).我已经设法使我的模拟遵循一个蓝点,但是我在模拟中制作多个版本的蓝点(也尝试在随机的初始位置出现)遇到了麻烦,并在模拟中对所有它们进行了动画动画跟随红点. 关于如何解决此问题的任何想法? 尝试使蓝色粒子的克隆动画: import numpy as np from matplotlib import pyplot as plt from matplotlib import animation from matplotlib.collections import PatchCollection from matplotlib import cm import random fig = plt.figure() fig.set_dpi(100) fig.set_size_inches(5, 4.5) ax = plt.axes(xlim=(0, 100), ylim=(0, 100)) ene
我正在寻找一种强大的方式到达3D图粒子,我的3D坐标和半径: x=[0 1 1 0 0 1 1 0]'; y=[0 0 1 1 0 0 1 1]'; z=[0 0 0 0 1 1 1 1]'; radius=[0.1 0.5 0.1 1 1 0.4 0.6 0.2]'; 我尝试使用: scatter3(x,y,z,4/3*pi.*radius.^3,'filled') 问题:如何以保留相对大小和位置的保存方式绘制粒子(因此,当修改窗口大小时,粒子看到使用轴相应地调整其尺寸)? 基本上,我想在MATLAB中获取以下图(我使用ovito,从一个.xyz(text)文件获得的(text)文件(text)文件(它包含[x; y; z; radius])),并有可能性调整图形窗口的大小,并相对于粒子的明显大小,仍然获得适当的轴尺度): 解决方案 确定找到了.还要感谢@gnovice(谢谢您的伴侣).在下面,根据其半径选择每个粒子的颜色. 这是代码:
我正在使用粒子系统.我的粒子从中心出来,但我希望不同的图像出来. 这些图像的文件路径存储在数组中.我发挥了一项函数来完成该安排并返回每个位置中的一切. 返回的是将每个图像发送到 source 的路径. 问题是,如果您滚动整个数组,但仅返回最后一个图像的路径,从逻辑上讲,我会得到一个图像,而不是存储在数组中的二十个图像. 有人可以帮我吗? 帮助和建议被公认. 这是我的代码: import QtQuick 2.0 import QtQuick.Particles 2.0 Rectangle { id: bg width: 1920 //360 height: 1080 //360 color: "black" ParticleSystem { id: particleSys } Emitter{ id: pa
我一直在尝试对这个项目做些事情,但我一直失败了:)所以决定在这里询问:) 我希望颗粒从岩石级别上绕着椭圆形,而不是通过它,而是在岩石级别上,就像一条河流在河中流动的岩石一样.有什么建议 ? int NUM_PARTICLES = 1000; ParticleSystem p; Rock r; void setup() { smooth(); fullScreen(P2D); //size(700,700,P2D); //background(0); p = new ParticleSystem(); r = new Rock(); } void draw() { background(0); p.update(); p.render(); r.rock(); } float speed = 1; class Particle { PVector position, velocity; Particle() {
作为玩具,它运行良好,但显然,当它缩放起来时,它会陷入困境. 我该如何在不要求海龟问其他海龟的情况下执行此系统? 代码是. to go ask turtles [ ask other turtles [ set heading towards myself let D distance myself let C .1 / D - 1 / (D ^ 2) if C > 1 [set C 1] fd C ] ] tick 结束 我应该知道如何做到这一点,但是大脑不起作用.如果我先获得答案,我将与答案进行比赛,并发布自己的答案. 解决方案 您是否在考虑这个? turtles-own [m]