16092001(镜头粒子)

【目标】

镜头粒子的实现

【思路】

1 之前的实验

\ue3\Development\Src\ExampleGame\Classes\ExamplePlayerCamera.uc


	Begin Object Class=SpriteComponent Name=Sprite

		Sprite=Texture2D‘EditorResources.S_Emitter‘

		//HiddenGame=True

		AlwaysLoadOnClient=False

		AlwaysLoadOnServer=False

		bIsScreenSizeScaled=True

		ScreenSize=0.0025

		SpriteCategoryName="Effects"

	End Object

	Components.Add(Sprite)

看不到

放到\ue3\Development\Src\ExampleGame\Classes\ExampleSkeletalMeshActor.uc

可以看到

2 EmitterCameraLensEffectBase

3 UDN中描述

http://udn.epicgames.com/Three/CameraTechnicalGuideCH.html

镜头特效

镜头特效是粒子特效,可以将其用于玩家的相机的镜头。这些镜头特效可以用于创建诸如相机镜头中下的雨滴、血溅、镜头上的污物或灰尘等等这一类的效果。这个 camera 类会包含可以使用这些特效类型的函数。

要了解有关粒子系统和特效的更多信息,请参阅ParticleSystemReference(粒子系统参考)。

镜头特效属性

    • CameraLensEffects – 当前应用于相机的所有粒子特效的数组。

镜头特效函数

  • FindCameraLensEffect [LensEffectEmitterClass] – 会搜索当前应用于相机的镜头特效并返回任何与之匹配的类型。

    • LensEffectEmitterType – 要搜索的镜头特效的类。
  • AddCameraLensEffect [LensEffectEmitterClass] – 会将指定类型的新镜头特效应用于相机中。
    • LensEffectEmitterClass – 要应用到相机中的镜头特效的类。
  • RemoveCameraLensEffect [Emitter] – 从相机中删除一个镜头特效。
    • Emitter – 要从相机中删除的镜头特效。
  • ClearCameraLensEffects – 删除当前应用于相机中的所有镜头特效。

4 在Notify_CameraEffect中 资源新建出来是空的

修改\Development\Src\Engine\Classes\AnimNotify_CameraEffect.uc试下

defaultproperties

{

CameraLensEffect=class‘Engine.EmitterCameraLensEffectBase‘

}

编译uc‘通过

测试无效果

5 实验:UAnimNotify_CameraEffect.Notify 中

void UAnimNotify_CameraEffect::Notify( UAnimNodeSequence* NodeSeq )

{

AActor* Owner = NodeSeq->SkelComponent->GetOwner();

CameraLensEffect = AEmitterCameraLensEffectBase::StaticClass();

机器人的动作上绑

跑地图测试,触发run动作,发现Spawn不了抽象类

该类的脚本

难道需要继承一个类

好吧,添加一个EmitterCameraLensEffect.uc

class EmitterCameraLensEffect extends EmitterCameraLensEffectBase

native(Particle);

DefaultProperties

{

}

编译uc

添加这个派生类之后就看到了

在\Development\Src\Engine\Classes\EmitterCameraLensEffectBase.uc中设置PSTemplate

PS_CameraEffect=ParticleSystem‘FogClouds.P_TestCloud_c‘

PS_CameraEffectNonExtremeContent=ParticleSystem‘ef_wj_016.ef_wj_016_eff01‘

测试发现,没有调用UpdateCameraLensEffects函数来更新位置

打印一些GamePlayerCamera.UpdateViewTarget的log

原因是ExamplePlayerCamera.有自己的UpdateViewTarget

\Development\Src\ExampleGame\Classes\ExamplePlayerCamera.uc添加应用LensEffect函数

`log("ExamplePlayerCamera::UpdateViewTarget 4");

UpdateCameraLensEffects( OutVT );

还需要复制UpdateCameraLensEffects

/** Update any attached camera lens effects (e.g. blood) **/

simulated function UpdateCameraLensEffects( const out TViewTarget OutVT )

{

local int Idx;

for (Idx=0; Idx<CameraLensEffects.length; ++Idx)

{

if (CameraLensEffects[Idx] != None)

{

CameraLensEffects[Idx].UpdateLocation(OutVT.POV.Location, OutVT.POV.Rotation, OutVT.POV.FOV);

}

}

}

屏幕上出现了粒子,

小结:

  • 这里是Notify触发一个Class去Spawn出一个Emitter
  • 这样做很不方便

方案

  • 继承一个EmitterCameraLensEffectBase的派生用于Notify类型的
  • Notify中可配置特效Template,和摄像机的距离等参数
  • Spawn出来后,Notify再将参数传递给它
  • 如果是场景相关的也是配置到WorldInfo中
  • 在PlayerController的PostBeginPlay中去Spawn,不行!此时还没有Camera,添加不了特效
  • 在PlayerController.SpawnPlayerCamera

问题:

  • 在PlayerController无法去传递参数
  • 原有机制的初衷应该是所有参数都在CameraLensEffectClass中
  • 所以如果能做多个派生类,在资源管理器中去选择,
  • 那每新建一个不同资源,就要都要写一个uc,而且还需要编译u,
  • 为什么不能实时动态的去控制它,修改资源
  • 添加另外的接口,在Spawn的是否传入PSTemplate

待解决

  • 删除的时机,如果是循环粒子
  • 如何切换,替换原有的,根据类型来判断?

【步骤】

1 修改\Development\Src\Engine\Classes\AnimNotify_CameraEffect.uc

/**

*  How far in front of the camera this emitter should live, assuming an FOV of 80 degrees.

*  Note that the actual distance will be automatically adjusted to account for the actual FOV.

*/

var() float                    DistFromCamera;

/** Particle System to use */

var() ParticleSystem        PS_CameraEffect;

...

defaultproperties

{

CameraLensEffect=class‘Engine.EmitterCameraLensEffect‘

DistFromCamera=90

}

2 添加AddEmitterCameraLensEffect 接口

/**

*  Initiates a camera lens effect of the given PSTemplate on this camera.

*/

function EmitterCameraLensEffectBase AddEmitterCameraLensEffect( ParticleSystem LensEffectTemplate )

{

local vector CamLoc;

local rotator CamRot;

local EmitterCameraLensEffectBase LensEffect;

if (LensEffectTemplate != None)

{

LensEffect = Spawn( class‘EmitterCameraLensEffect‘, PCOwner.GetViewTarget() );

if (LensEffect != None)

{

LensEffect.SetEffectTemplate(LensEffectTemplate);

GetCameraViewPoint(CamLoc, CamRot);

LensEffect.UpdateLocation(CamLoc, CamRot, GetFOVAngle());

LensEffect.RegisterCamera(self);

CameraLensEffects.AddItem(LensEffect);

}

}

}

3 UAnimNotify_CameraEffect.Notify 

AEmitterCameraLensEffectBase* pCameraEffect = Cast<APlayerController>(Owner->GetAPawn()->Controller)->eventClientSpawnLensEffect(PS_CameraEffect);

if (pCameraEffect)

{

pCameraEffect->DistFromCamera = DistFromCamera;

}

如果不旋转呢?

4 为EmitterCameraLensEffectBase添加两个属性

var protected transient bool                bAdjustRot;

var protected ESceneDepthPriorityGroup        DepthPriorityGroup;

event SetEffectTemplate(ESceneDepthPriorityGroup NewDepthPriorityGroup)

{

ParticleSystemComponent.SetDepthPriorityGroup(NewDepthPriorityGroup);

}

5 场景的配置,修改worldinfo.uc

var (Player)    ParticleSystem        CameraEffect;

\Development\Src\ExampleGame\Classes\ExamplePlayerController.uc

simulated event PostBeginPlay()

{

local EmitterCameraLensEffectBase LensEffect;

super.PostBeginPlay();

if ( WorldInfo.CameraEffect != none )

{

LensEffect = ClientSpawnLensEffect(WorldInfo.CameraEffect);

if ( LensEffect != none )

LensEffect.SetDepthPriorityGroup(SDPG_World);

}

}

6 PlayerController.SpawnPlayerCamera

// Camera Effect

if ( WorldInfo.CameraEffect != none )

{

`log( "Examp PC PostBeginPlay 1" );

LensEffect = ClientSpawnLensEffect(WorldInfo.CameraEffect);

if ( LensEffect != none )

LensEffect.SetDepthPriorityGroup(SDPG_World);

}

跑地图看不到粒子 OMG

有tick有调用FParticleDataManager.UpdateDynamicData.

修改一下调用时机,在UWorld.Tick中调用一次,就可以看到

在UWorld.SpawnPlayActor最后面调用就行了

7 UWorld添加一个接口是 用于设置镜头特效的,用于Matinee等地方触发

8 修改Emitter.uc  添加一个镜头属性

var(LensEffect)            bool                        bLensEffect;

var(LensEffect)            bool                        bAdjustRot;

var(LensEffect)            float                        DistFromCamera;

var(LensEffect)            ESceneDepthPriorityGroup    DPG;



void USkelControlHitPlacement::CalculateNewBoneTransforms(INT BoneIndex, USkeletalMeshComponent* SkelComp, TArray<FBoneAtom>& OutBoneTransforms)
{
    check(BoneIndex != 0);
....
}

【运行】

3

来自为知笔记(Wiz)

时间: 2024-11-07 06:58:08

16092001(镜头粒子)的相关文章

粒子和粒子系统

1.粒子材质和粒子几何体 创建粒子系统的点,可以存放在Geometry几何体中.使用Geometry的vertices保存点.colors保存点的颜色.但我们必须使用粒子的专用材质对象PointCloudMaterial(原名叫做ParticleBasicMaterial)设置材质.包含的属性如下列表: 名称/描述 color/PointCloud对象中所有粒子的颜色.如果vertexColors设置为true,而且也指定了几何体的colors属性,那么该属性被忽略 map/可以在粒子上应用某种

CAEmitterLayer 粒子效果(发射器)

//创建Layer CAEmitterLayer *emitterLayer = [CAEmitterLayer layer]; //边框 emitterLayer.borderWidth = 1.0f; //尺寸 emitterLayer.frame = CGRectMake(100, 100, 100, 100); emitterLayer.masksToBounds = YES; //发射点 emitterLayer.emitterPosition = CGPointMake(0, 0);

粒子群算法

粒子群算法是基于鸟群觅食的行为提出来的,每一个单一个体鸟视为搜索空间的一个粒子,都被视为问题的可能解,每个粒子都有一个由待优化函数决定的适应度函数,通过适应度值迭代更新粒子的位置和速度 粒子速度和位置的维度由问题的未知量决定,例如,求sin(∑i=1 to kxi-4)的最小值,如果k=2,那么速度V和位置X就是二维的,如果k=20,那么V和X都是20维的 设粒子i的历史最优位置为p,种群粒子的历史最优位置为pg,粒子按照下式来更新位置和速度: v=w*v+c1r1(p-x)+c2r2(pg-x

Three.js开发指南---粒子和粒子系统(第七章)

使用粒子可以很容易的创建很多细小的物体,例如雨滴雪花等 本章主要内容: 1 使用ParticleBasicMaterial(基础粒子材质)来创建和设计粒子 2 使用ParticleSystem来创建一个粒子集合 3 使用已有的几何体来创建一个粒子系统 4 让粒子和粒子系统动起来 5 用纹理给粒子造型 6 使用ParticleCanvasMaterial在画布上为粒子造型 名称 描述 Sprite粒子 参数是material,生成的sprite可以设置position和scale等属性直接添加到场

粒子拼字效果(getImageData方法)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta h

粒子群优化算法

2011-12-05 19:49:55 标签:群智能 休闲 蚁群优化 粒群优化 粒子群优化 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nxlhero.blog.51cto.com/962631/734212 粒子群优化算法属于群智能(swarm intelligence)优化算法.群智能分两种,一种是粒群优化,另一种是蚁群优化. 群智能概念 假设你和你的朋友正在寻宝,每个人有个探测器,这个探测器可以知道宝藏到探测器的距离

基于粒子滤波的目标追踪

基于粒子滤波的目标追踪 particle filter object tracking 读"K. Nummiaro, E. Koller-Meier, L. Van Gool. An adaptive color-based particle filter[J], Image and Vision Computing, 2002"笔记 粒子滤波中最重要的一个过程就是重要性重采样, Sampling Importance Resampling (SIR). 这篇博客基于粒子滤波的物体跟踪

第四篇、点赞的粒子动画

点赞动画 iOS自带了粒子引擎的类 CAEmitterLayer ,是一个粒子发射器系统,每个粒子都是 CAEmitterCell 的实例.可以查看它们分别有什么属性. 有两个小点,一个是 CAEmitterLayer 一些属性对 CAEmitterCell 有成倍作用,如 birthRate :另一个是没有明确的停止动画的方法,包括它的父类也没提供.可以想到的方法,除了把 layer 抹除掉之外,还可以将 CAEmitterLayer 的 birthRate 设置为0,这样每个 CAEmitt

【计算机视觉】粒子滤波跟踪

粒子滤波步骤 1.初始化随机选取N个点,权重统一赋值1/N 2.选取目标特征,颜色直方图等等,用于获取先验概率密度,对比相似度 3.确定状态转移矩阵,用于预测下一帧目标位置 循环开始 4.根据状态转移矩阵,对每个粒子,预测目标新位置 5.获得系统观测值,计算观测位置处特征 6.计算每个预测位置处特征,与观测处位置特征对比,相似度高的赋予较大的权重,反之,赋予较小的权重 7.对粒子加权获取当前的目标最佳位置 8.粒子重采样 循环结束 上面是我自己的理解,有些问题仍然不明白: 1.都有观测值了还修正