HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动

依然是上次就已经作过的内容,因此第二篇来的很快。html


首先动态须要一个时间的概念,时间不一样也就不存在动态效果了。函数

于是首先须要添加一个时间变量,在RenderMonkey有一系列预约义变量,好比咱们刚建立完一个项目就能看matViewProjection这个变量,就是一个预约义变量,这是一个世界,观察,投影的合矩阵,在Vertex Shader中咱们模型顶点位置向量须要与这个矩阵相乘完成坐标转换才能使模型出如今预览窗口。关于这几个矩阵,能够参看这篇博客的详解工具

http://www.cnblogs.com/kex1n/archive/2011/08/19/2145866.htmlspa


回到咱们的时间变量,添加系统的预约义时间变量fTime0_X,以后我重命名成了timecode


接下来就能够去添加代码了,此次只是仅仅涉及顶点的移动,于是咱们只须要考虑Vertex Shader便可htm

float4x4 matViewProjection;
float time;

struct VS_INPUT 
{
   float4 Position : POSITION0;
   float2 TexCoord : TEXCOORD0;
   
};

struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float2 TexCoord : TEXCOORD0;  
   
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
   
   float banner_x=0.04f;
   float banner_z_min=1.1f;
   float banner_z_max=2.2f;    
   
   if((Input.Position.x>banner_x)&&(Input.Position.z>banner_z_min)&&(Input.Position.z<banner_z_max))
      Input.Position.y = Input.Position.y+0.5*Input.Position.x*sin(2*time+Input.Position.z);

   Output.Position = mul( Input.Position, matViewProjection );
   Output.TexCoord=Input.TexCoord;
   
   return( Output );
   
}

首先咱们须要声明这个时间变量time,以后去到vs_main函数里修改顶点的位置blog

这里的模型依然是上一篇中的旗帜,显然咱们只须要移动旗面的顶点,旗杆是固定不动的。get

因此咱们用最简单的坐标范围来判断那些顶点须要移动。博客

具体每一个顶点的坐标数值能够去建模工具内查看。须要注意的一点是坐标的不一样。it

仅仅是左右手坐标系的不一样能够右键你的模型->Orientation来切换左右手坐标系。

可是若是是模型摆放都出现了差异就须要本身稍微看一下。

以下两图,同一个模型在RM和3DMAX的坐标系中的位置

肯定范围以后就能够去让范围内的旗帜沿着旗帜的法线方向作周期运动了

这里使用了sin函数来作基本的周期运动,顶点的X坐标做为振幅,Z坐标做为相位,这样旗帜就飘动的相对天然一点。


不过这样机械化的飘动其实仍是不天然, 能更随机化一点才真实,之后看看有什么好办法。

下一篇应该是作一个天空盒子的渐变,也是以前作过的,都整理一下。

相关文章
相关标签/搜索