我想使用Z坐标在3D中渲染粒子效果.我试图使用Decals而不是Sprites来实现自己的ParticleEffect而没有成功.
有没有其他方法使用Z坐标渲染ParticleEffect?也许通过操纵SpriteBatch的转换矩阵?
更新:
工作代码
// update projection each frame since my camera is moving
spriteBatch.setProjectionMatrix(camera3d.projection);
for (ParticleEffect effect : effects){
spriteBatch.setTransformMatrix(camera3d.view);
spriteBatch.getTransformMatrix().translate(x,y,z); // different for each effect
spriteBatch.getTransformMatrix().scale(0.1f,0.1f,0.1f); //optional
spriteBatch.begin();
effect.draw(spriteBatch, delta);
spriteBatch.end();
spriteBatch.getTransformMatrix().idt();
}
Run Code Online (Sandbox Code Playgroud) 我用libgdx在我的android设备上画火:
ParticleEffect effect;
ParticleEffectPool fireEffectPool;
Array<PooledEffect> effects = new Array<PooledEffect>();
@Override
public void create()
{
...
effect = new ParticleEffect();
effect.load(Gdx.files.internal("particles/fire01.p"), Gdx.files.internal("image"));
effect.setFlip(true, false);
fireEffectPool = new ParticleEffectPool(effect, 1000, 3000);
PooledEffect myEffect = fireEffectPool.obtain();
myEffect.setPosition(200, 400);
effects.add(myEffect);
...
}
Run Code Online (Sandbox Code Playgroud)
我可以通过编程方式旋转,设置速度或缩放效果吗?
我使用的是libgdx 0.9.9版.我想在3D空间中使用ParticleEffect以及其他3D模型渲染火焰效果.
我的代码的逻辑流程:
问题:火焰效果在3D空间中的某个点上呈现正常.但是当我旋转相机以使3D模型位于相机和火焰效果之间时,火焰效果会渲染3D模型,而不是隐藏在3D模型后面.
我尝试过的事情:
有没有人遇到类似的问题?任何建议的解决方法都可以使ParticleEffect成为3D世界的一部分,以便在被其他3D模型阻挡时隐藏它?我看过Xoppa在youtube上发布了关于libgdx中3D粒子的视频,但没有提到步骤/解决方案.任何帮助将受到高度赞赏.
我在Xcode中创建了一个具有相当长的路径的粒子发射器.当我在粒子生成器内移动它时,它会沿着我的鼠标路径留下一条线索.
关于我的目标的一些背景信息: 在我的spriteKit游戏中,用户在屏幕上拖动手指来拍摄移动的物体.我试图创建一个"子弹时间"效果,其中对象减速并在当前手指位置接触它们时突出显示.当手指停止移动或者弹药耗尽时,会触发touchesEnded方法拍摄所有突出显示的对象.目前我有他们旅行的路径显示为使用SKShapeNode和CGPath绘制到屏幕的线,但我希望使用发射器路径突出显示路径.
在触摸开始的方法中,我创建了一个圆形SpriteNode,它可以在手指移动到的任何地方移动(物理碰撞附加到圆而不是路径).我已经将粒子轨迹发射器连接到这个圆圈,当我在屏幕上移动它时它随着圆圈移动,但是没有留下痕迹.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInNode:self];
pathToDraw = CGPathCreateMutable();
startPoint = touchLocation;
CGPathMoveToPoint(pathToDraw, NULL, touchLocation.x, touchLocation.y);
lineNode = [SKShapeNode node];
lineNode.path = pathToDraw;
lineNode.lineWidth = 2;
lineNode.zPosition = 110;
lineNode.strokeColor = [SKColor whiteColor];
[self addChild:lineNode];
circle = [SKSpriteNode spriteNodeWithTexture:[animationsAtlas textureNamed:@"anim_countdown_9"]];
circle.name = @"circle";
circle.scale = 0.3;
circle.alpha = 0.5;
circle.zPosition = 110;
circle.position = touchLocation;
circle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:20];
circle.physicsBody.categoryBitMask = weaponCategory;
circle.physicsBody.dynamic = NO; …
Run Code Online (Sandbox Code Playgroud) 我在Processing中模拟粒子系统.基于丹尼尔希夫曼的"本质的代码"一书,我做了一个弹簧,然后我开始尝试使用滑块做一个基于滑块的长度更长或更短的滑块.
现在,我试图制作一个滑块滑动,两个粒子移动到两个粒子的相同方向.我使用PVector添加,找到新位置并绘制节点,但是当我有多个成员且一个受其他成员影响时它不起作用.我需要使用一个force来执行此操作:请参阅applyForce()函数.
void update(float distance) {
PVector force = PVector.sub(b.location, a.location);
float d = force.mag();
float x = d - distance;
//direction of the force
force.normalize();
force.mult(-1 * k* x/mass);
//apply to one node
b.applyForce(force);
force.mult(-1);
//apply opposite to the other node
a.applyForce(force);
}
//Newton's law: F = M * A
void applyForce(PVector force) {
PVector f = force.get();
f.div(mass);
acceleration.add(f);
}
Run Code Online (Sandbox Code Playgroud)
检查下图:
(a)是我想要的,(b)它现在是怎么做的.
在第一个例子中,长度相同,成员滑动(两个粒子).
在第二个中,长度更大并且不会滑动
如果您知道如何施加滑动构件的力,请告诉我.
谢谢
我是Unity新手。
有人可以告诉我这个错误是什么意思
Ensure Read/Write is enabled on the Particle System's Texture
Run Code Online (Sandbox Code Playgroud)
粒子系统需要在开始时播放,但有时不需要工作(播放效果)。谢谢
我目前正在使用 C++ 和 SDL2 开发一个非常简单的“落沙”模拟游戏,并且在让水以更逼真的方式流动方面遇到了问题。我基本上有一个单元格网格,我从下到上,从左到右迭代,如果我找到一个水单元格,我只需检查下面,从下到左,下到右,左然后右的空单元格它移动到它找到的第一个(如果两个对角线单元格或两个水平单元格都是空闲的,它会随机选择)。然后我将它移动到的单元格标记为已处理,以便在该循环的其余部分不会再次检查它。
我的问题是粒子如何移动的一种“左偏”;如果我在屏障上方生成一个正方形的水细胞,一旦粒子开始到达屏障,它们基本上都会向左移动而不移动,而右侧的细胞将以正确的方式向下运行。所以不是形成一个漂亮的三角形,均匀地流向两边,整个形状只会向左移动。每当我从左到右迭代时,这种效果就会逆转,所以我知道这与此有关,但到目前为止我一直在努力修复它。我最初认为这是我如何将单元格标记为已处理的问题,但在数小时的测试中我没有发现该系统有明显的错误。有没有人在开发这样的模拟时遇到过任何类似的挑战,或者知道一些我' 我失踪了?任何帮助将不胜感激。
编辑: 好的,所以我取得了一些进展,但是我遇到了另一个似乎与迭代无关的错误,因为现在我保存了旧单元格的副本并从中读取以决定更新,然后更新原始单元格并显示它。这已经使沙子更好地工作,但是水平检查游离细胞的水现在在水平移动时“消失”。我整个上午都在测试它,但还没有找到解决方案,我认为这可能与我复制数组的方式有关,但据我所知,它似乎有效。
新片段:
模拟.cpp
void Simulation::update()
{
copyStates(m_cells, m_oldCells); // so now oldcells is the last new state
for(int y = m_height - 1; y>= 0; y--)
for(int x = 0; x < m_width; x++)
{
Cell* c = getOldCell(x, y); // check in the old state for possible updates
switch(c->m_type)
{
case EMPTY:
break;
case SAND:
if(c->m_visited == false) update_sand(x, y);
break;
case WATER:
if(c->m_visited == false) update_water(x, y);
break;
default:
break; …
Run Code Online (Sandbox Code Playgroud) c++ simulation cellular-automata game-physics particle-system
我正在使用带有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)......有什么想法吗?
我正在使用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)
现在,粒子从文本中心的单个点发出.有没有办法将粒子锁定到文本的表面,然后运行系统来模拟爆炸文本?
如果没有,这可以用任何其他几何对象如立方体完成吗?
我正在尝试制作一个脚本,以便在按下按钮时粒子系统会更改为某种颜色,除了更改粒子颜色之外,它一切正常,当我尝试时会出现以下错误:
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) particle-system ×10
libgdx ×3
simulation ×2
3d ×1
android ×1
c# ×1
c++ ×1
game-physics ×1
glsl ×1
ios ×1
ios7 ×1
java ×1
opengl-es ×1
particles ×1
processing ×1
scenekit ×1
spring ×1
sprite-kit ×1
spritebatch ×1
swift ×1