2024年10月20日

ue4.26 niagara collisionNormal问题

目的是让粒子片自由下落,与表面碰撞后停止并调整为与表面一致的朝向。

测试用例搭建如下:

1,建一个niageraSystem,直接用Fountain模板。

2,确认Emitter Properties中Sim Target是CPUSim(出于兼容性考虑)

2,在Solve Forces and Velocity前添加Collsion模块(CPU碰撞)。

3,将Collision中的Friction和Friction During a Bounce都给很大的值,不希望落地后滑动或反弹。

4,Emitter Settings中Interpolated Spawning去掉勾选。(无关紧要)

5,Emitter State中Loop Behavior改成Once。

6,关闭Spawn Rate模块,添加Spawn Burst Instantaneous模块,Spawn Count设置为100,Spawn Time设置为0。

7,Initialize Particle模块中Lifetime设为-1,适当调大Uniform Sprite Size。(补:Particle State模块KillParticles When Lifetime Has Elapsed去掉勾选)

8,关闭Sphere Locationty和Add Velocity in Cone,添加Box Location,给适当的box size。

9,关闭Drag和Scale Color。

10,将Render中的Facing Mode改为Custom Facing Vector,鼠标放在上面会有提示:此模式下是通过设置Particles.SpriteFacing调整粒子朝向。

11,在Parameters下的Particle Attributes下添加SpriteFacing变量,然后在Particle Spawn阶段赋值(0,0,1),在Particle Update末尾将[Transient]CollisionNormal赋给SpriteFacing。

注:niagara parameters中显示transient变量,需要勾选show advanced categories

 

将粒子放在斜面上方播放,在原版ue4.26下表现符合预期,粒子落地后就面向地面法线方向。

但在项目引擎里却效果却不对,粒子落地后还还是朝上。

说明在项目引擎里CollisionNormal不正确,于是怀疑是项目引擎修改过产生了bug。

用引擎源码启项目调试。

搜CollisionNormal,可以找到其赋值处:

 可见,是由CollisonTraces中取得Hit信息,然后将Hit.ImpactNormal赋予CollisionResults中的元素的CollisionNormal。

跳转到CollisionResults的定义:

 然后find references,可以找到从CollisionResults里取结果的函数:

GetQueryResult的调用处为:

这也正是CollisionNormal赋给transient变量CollisionNormal的地方了。

 

为了调试方便,将Spawn Burst Instantaneous中的Spawn Count改为1,即只生成一个粒子。待粒子落到斜面上后如下打断点:

则会发现第一个断点有时能断到,有时断不到,断点1断到的时候继续运行到第二个断点时CollisionResults中元素个数就是1,而且CollisionNormal值确实为斜面法线,断点1断不到的时候直接运行到第二个断点时CollisionResults中元素个数就是0(Empty)。

也就是说,当CollisonResults非空时法线是正确的,只不过有很多时候是空。

而出现为空的情况也不能断定就是有错,因为有可能那帧确实没监测到碰撞,就是[transient]CollisionValid=false的情况(尽管粒子都已经落地了还有监测不到碰撞的情况也让人觉得不太正常,而且原版引擎就不会这样)。

如果不深纠和原版引擎一样,而只是想个办法把问题绕过去的话,那么现在已经有方法了。方法是:既然CollisionNormal时有时无,那就自定义一个CollisionNormalLatest,用它来记录最近的一次有效的CollisionNormal,用这个Normal作为最终粒子朝向。

于是emitter修改如下:

1,添加InitCollisionNormalLatest模块,将CollisionNormalLatest初始化为(0,0,1)

2,添加SetFacingUseCollisionNormalLatest模块,计算CollisionNormalLatest并赋给SpriteFacing:

3,添加ClearVelocityAndForce模块,将已发生碰撞的粒子Velocity和PhysicsForce清零,另外对于已碰撞的粒子还要关闭Collision和Gravity Force:

 这样,粒子落地后,朝向就正确了:

 

posted @ 2024-10-20 21:29 wantnon 阅读(53) 评论(0) 推荐(0) 编辑

2024年4月28日

ue4.26 通过材质开关控制mesh pass的blend function

摘要: 一,mesh pass中blend function的设置方法 在mesh pass中设置blend function有如下几种方式: 1,在CreateXXXProcessor (返回FXXXProcessor)中: 2,FXXXProcessor::AddMeshBatch中: 3,FXXXPr 阅读全文

posted @ 2024-04-28 16:39 wantnon 阅读(64) 评论(0) 推荐(0) 编辑

ue4.26 Translucency->Render After DOF

摘要: 横竖放两个带法线半透明片,lighting model选前向透明,将横片的Translucency Sort Priority设为1,竖片的Translucency Sort Priority设为0,以确保先画竖片后画横片(其实都设为0也行,因为Translucency Sort Priority相 阅读全文

posted @ 2024-04-28 01:10 wantnon 阅读(169) 评论(0) 推荐(0) 编辑

2024年2月1日

ue4.26 为staticmesh每级lod制定材质球

摘要: 视频: materialForEachLod - 知乎 (zhihu.com) EditorStaticMeshLibarary.h UFUNCTION(BlueprintCallable, Category = "MY") static void recreateSectionInfoMap(US 阅读全文

posted @ 2024-02-01 02:42 wantnon 阅读(90) 评论(0) 推荐(0) 编辑

2024年1月28日

ue4.26 CurveLinearColorAtlas支持非正方形尺寸

摘要: 默认CurveAtlas只能是正方形 改代码可以让它支持非正方形: 改法如下: CurveLinearColorAtlas.h // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal. 阅读全文

posted @ 2024-01-28 18:11 wantnon 阅读(61) 评论(0) 推荐(0) 编辑

2024年1月18日

ue4.26 Assertion failed: MeshCommands.Num() == MeshCommandsCSM.Num() 解法

摘要: 在ue4.26的pc端添加了自定义meshpass xxxPass,切到移动端后产生如下错误: Assertion failed: MeshCommands.Num() == MeshCommandsCSM.Num() VisibleMeshDrawCommands of BasePass and 阅读全文

posted @ 2024-01-18 03:18 wantnon 阅读(55) 评论(0) 推荐(0) 编辑

2023年11月20日

ue4.26 base pass宏和lighting pass宏

摘要: 一,basepass宏 能在母材质面板上设置的宏,为basepass宏,只能影响basepass。 可以用已有的宏MATERIAL_SSR做个试验。 我们通过下面代码可知,MATERIAL_SSR宏对应材质编辑器detail面板上的Screen Space Reflections 在ShadingM 阅读全文

posted @ 2023-11-20 02:23 wantnon 阅读(131) 评论(0) 推荐(1) 编辑

2023年10月31日

ue4.26 CustomPrimitiveData导致staticmesh editor预览变黑解法

摘要: 一,customPrimitiveData用法 及 导致staticmesh editor预览变黑 材质里这样连: actor上设置custom primitive data数据,则模型呈现相应颜色: 但此时若打开staticmesh editor,会发现预览变黑: 那是因为staticmesh e 阅读全文

posted @ 2023-10-31 00:56 wantnon 阅读(157) 评论(0) 推荐(0) 编辑

2023年10月13日

single layer water支持半透

摘要: 一,参考前向透明 为了给single layer water加半透,先看一下普通前向透明是如何实现半透的。 对前向透明球体截帧: 可见pass名为SeparateTranslucency,于是在源码中搜 "SeparateTranslucency,定位到: 进入RenderViewTransluce 阅读全文

posted @ 2023-10-13 21:03 wantnon 阅读(171) 评论(0) 推荐(0) 编辑

2023年10月12日

ue4.26 forward translucency shadow

摘要: 对于前向透明材质: 想找到其阴影代码。 首先由于是前向透明物体,所以肯定不是像不透明物体那样有screen space shadow mask图,而是在shader中计算前向光照时顺便计算阴影。所以只需找到相应shader文件。 为此用renderDoc截帧,但默认截帧只显示pass名,而不显示sh 阅读全文

posted @ 2023-10-12 15:15 wantnon 阅读(58) 评论(0) 推荐(0) 编辑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示