我正在使用带有PointSprites的ParticleSystem(受Cocos2D Source的启发).但我想知道如何重建OpenGL ES 2.0的功能
glEnable(GL_POINT_SPRITE_OES);
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2));
glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
glDisable(GL_POINT_SPRITE_OES);
Run Code Online (Sandbox Code Playgroud)
这些在使用OpenGL ES 2.0上下文时生成BAD_ACCESS.我应该每个PointSprite只使用2个TRIANGLES吗?但那可能不是很有效(额外顶点的开销).
编辑:所以,我的建议解决方案的新问题来自:https: //gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528
可以在批量调用中传递许多不同的大小.我想过使用Attribute而不是Uniform,但是我需要总是将PointSize传递给我的着色器 - 即使我没有绘制GL_POINTS.那么,也许是第二个着色器(仅用于GL_POINTS的着色器)?!我不知道在绘制例程中每一帧切换着色器的开销(因为如果使用粒子系统,我自然也想渲染没有pointSize的常规GL_TRIANGLES)......有什么想法吗?
对于图形课程,我们在WebGL中实现粒子系统.在JavaScript中进行粒子模拟计算会非常慢,我们的教授希望我们在GPU上进行粒子模拟.
为了做这个粒子模拟,我想我们上传一个包含我们的粒子数据(位置,速度,质量等)的顶点缓冲区,然后让我的顶点着色器为模拟做一些数学运算,并将结果写入不同的顶点缓冲区,表示粒子的下一个状态.然后我可以gl.POINTS
使用不同的着色器程序渲染我的粒子进行渲染.
这似乎是变换反馈,我在这里学习:http://open.gl/feedback
但是,似乎转换反馈目前不包含在WebGL中.这篇博客文章称,WebGL 2.0将提供转换反馈.实际上,当我尝试这样的语句时gl.beginTransformFeedback;
,我得到一个错误,说明方法没有定义.
如果变换反馈不可用,我应该如何在WebGL中进行粒子模拟?
我正在使用Swift SceneKit制作一些爆炸的3D文本.这是文字:
let text = SCNText(string: "Exploding Text", extrusionDepth: 5)
let node = SCNNode(geometry: SCNText)
scene.rootNode.addChildNode(node)
Run Code Online (Sandbox Code Playgroud)
这是我的粒子系统:
let exp = SCNParticleSystem()
exp.loops = false
exp.birthRate = 5000
exp.emissionDuration = 0.01
exp.spreadingAngle = 180
exp.particleDiesOnCollision = true
exp.particleLifeSpan = 0.5
exp.particleLifeSpanVariation = 0.3
exp.particleVelocity = 500
exp.particleVelocityVariation = 3
exp.particleSize = 0.05
exp.stretchFactor = 0.05
exp.particleColor = UIColor.blueColor()
scene.addParticleSystem(exp, withTransform: SCNMatrix4MakeRotation(0, 0, 0, 0))
Run Code Online (Sandbox Code Playgroud)
现在,粒子从文本中心的单个点发出.有没有办法将粒子锁定到文本的表面,然后运行系统来模拟爆炸文本?
如果没有,这可以用任何其他几何对象如立方体完成吗?
我正在试用 Scenekit,当我尝试在半透明对象后面渲染粒子时遇到了一个问题。它们只是不渲染,而场景中的其他对象会渲染。
在这张图片上,所有粒子都在半透明框前面,后面的所有粒子都不显示。可以看到球体显示正确,被覆盖部分的颜色变淡了。我希望粒子也一样,但也许框架的渲染选择使粒子系统高效,使这种行为正常?
我试过 google/stackoverflow 它,但似乎scenekit 不是一个很好涵盖的主题。
我正在使用Google Cardboard SDK整理应用程序.用户可以在有或没有纸板的情况下使用该应用程序.因此,应用程序内部有一个切换按钮,用于激活和停用立体渲染.
该应用程序还使用Vuforia SDK来跟踪图像目标.如果识别出特定目标,则目标上方的一些3D对象和粒子系统开始发射粒子.
在非立体声模式下一切正常.粒子按预期正确发射和下落.他们应该模拟雪.此外,如果用户将图像目标转到一个角度,则上面的3D对象会掉下来.
当切换到立体声模式时,物理学完全搞砸了.雪粒不再下降,它们似乎在屏幕周围"传送".此外,3D物体确实向上倾斜,具有非常重的负重力.时间尺度似乎成倍增加,但不是 - 我仔细检查过.在非立体和立体渲染之间切换时,重力也不会改变.
在蛾模式下,Unity Editor中的一切工作正常.它只出现在iPhone 5的设备上.
我仔细检查了重力和时间刻度,它们在模式之间切换时没有变化.我很难搞清楚可能导致物理问题陷入困境的原因.
我做了一些进一步的调查.我让我在相机前坐着一个小小的小发明,但是获得了Unity世界空间轴的旋转,所以我知道3D世界是相对于相机的.事实证明,当使用谷歌纸板相机系统处于VR模式时,世界确实在相机上大量旋转.我设法以某种方式拿着测试设备,所以它正在减速并且几乎冻结,但我还没有解释效果.
physics unity-game-engine particle-system vuforia google-cardboard
我的脚本有问题.我试图在一个球体中随机创建一个星场,用于我的统一场景.但我对团结和c#是新手,所以我有点困惑.
星星有一个固定的位置,所以它们不应该移动,因此在Start()中创建; 然后在Update()中绘制;
问题是我收到此错误:
MissingComponentException: There is no 'ParticleSystem' attached to the "StarField" game object, but a script is trying to access it.
You probably need to add a ParticleSystem to the game object "StarField". Or your script needs to check if the component is attached before using it.
Stars.Update () (at Assets/Stars.cs:31)
Run Code Online (Sandbox Code Playgroud)
如果我手动添加一个粒子系统组件,它会导致一大堆闪烁的橙色斑点,这是我不想要的,所以我想在脚本中添加一些组件.
这是我附加到空游戏对象的脚本:
using UnityEngine;
using System.Collections;
public class Stars : MonoBehaviour {
public int maxStars = 1000;
public int universeSize = 10;
private ParticleSystem.Particle[] points;
private void …
Run Code Online (Sandbox Code Playgroud) 我已经能够为画布创建一个粒子系统,它既简单又有效。
这是一个演示:https : //awingit.github.io/particles/
现在我想做的是在 Threejs 中创建同样的东西。但是,我还没有找到任何可供参考的示例,并且我无法在 3D 中创建与我的 2D 画布粒子系统相同的示例。
谁能给我一些关于如何在 Threejs 中做到这一点的方向?
我知道如何处理粒子,但我正在努力解决的是用线连接附近的点。
这是我添加基本粒子以创建雪/雨效果的方法:
function createSnow() {
for (var i = 0; i < particleCount; i++) {
var pX = Math.random() * 800 - 400,
pY = Math.random() * 700 - 250,
pZ = Math.random() * 800 - 400,
particle = new THREE.Vector3(pX, pY, pZ);
particle.velocity = {};
particle.velocity.y = -1;
particles.vertices.push(particle);
}
particleSystem = new THREE.Points(particles, pMaterial);
particleSystem.position.y = 0;
scene.add(particleSystem);
}
// This goes in …
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个脚本,以便在按下按钮时粒子系统会更改为某种颜色,除了更改粒子颜色之外,它一切正常,当我尝试时会出现以下错误:
NullReferenceException:不要创建自己的模块实例,而是从 ParticleSystem 实例获取它们
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attack : MonoBehaviour
{
public int MovementDirection = 0;
public int State = 0;
public GameObject attackOrb; //The prefab for our attack hitbox
public Transform Player; //Where the player is
public float R = 0.0F;
public float G = 0.0F;
public float B = 0.0F;
public float A = 1.0F;
private ParticleSystem attackEffect;
// Start is called before the first frame update
void Start()
{
attackEffect = gameObject.GetComponent<ParticleSystem>(); …
Run Code Online (Sandbox Code Playgroud) 我正在XNA4中创建一个粒子系统,但我遇到了问题.我的第一个粒子系统是一个简单的粒子列表,其实例是在需要时创建的.但后来我读到了使用池.
我的第二个系统包括一个充满粒子的池和一个发射器/控制器.我的游泳池很基本,这是代码:
class Pool<T> where T: new ()
{
public T[] pool;
public int nextItem = 0;
public Pool(int capacity)
{
pool = new T[capacity];
for (int i = 0; i < capacity; i++)
{
pool[i] = new T();
}
}
public T Create()
{
return pool[nextItem++];
}
public void Destroy(T particle)
{
pool[--nextItem] = particle;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是池系统对CPU更加饥渴.每次我从池中取出粒子到我的发射器时我都被迫重新初始化并重置粒子,因为构造函数不存在而且这是一个问题.
使用池有什么意义吗,如果我重新启动那些粒子,或者我应该为完全相同的对象的数组留下池,这些对象永远不会改变?
我试图打开和关闭我创建的粒子系统.
我把它贴在预制件上.
我使用的代码如下
public ParticleSystem waterGun;
void Update () {
if(Input.GetKey(KeyCode.W)){
waterGun.enableEmission = true;
}else if(Input.GetKeyUp(KeyCode.W)){
waterGun.enableEmission = false;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望粒子系统在按下键时在fps前面播放,在按下键时停止播放.