如果您在使用Actionscript之前已经熟悉了影片剪辑的工作原理,那么它们可以设置宽度,高度,x,y值,并且更改它们非常简单。
但是现在,我尝试使用libgdx(Java)& LibCinder(C ++)并且有很多内容,渲染现在通过OpenGL完成,并且需要着色器等', 我设法导入了一个我用它的纹理创建的3d网格,但现在在改变网格的位置/大小方面有点奇怪..
在我试图使用的两个库中,没有真正的方法来改变网格的大小或位置,就像我想的那样。 (起初,我期待像mesh.width / height,mesh.scale,mesh.x / y / z这样的东西)
所以我的问题是,设置这些值的实际方法是什么?
答案 0 :(得分:3)
您需要做的是3d transformations
。
在OpenGL或Direct3D中完成的方式通常是将网格的顶点与变换矩阵相乘。
网格大部分时间是从建模程序导出的,它们位于对象空间中。要将这些网格放置在您的世界中,您需要将它们与世界矩阵相乘,将它们带入世界空间。这个世界矩阵可以在一个矩阵中对比平移,旋转和缩放。 DirecXMath库为您提供了轻松创建这些矩阵的方法,并且还有OpenGL的免费库。
创建世界矩阵后,将其传递给顶点着色器,并将每个传入的顶点与矩阵相乘,得到世界空间中的顶点。
基本顶点着色器在HLSL中可能如下所示:
cbuffer cbPerObject : register(b0)
{
float4x4 world;
float4x4 viewProj;
};
struct VS_INPUT
{
float3 position:SV_POSITION;
};
struct VS_OUTPUT
{
float4 position:SV_POSITION;
};
VS_OUTPUT main( VS_INPUT vsin )
{
VS_OUTPUT output;
float3 position = mul( float4(vsin.position,1.0), world).xyz;
output.position = mul(float4(position,1.0), viewProj);
return output;
}
因此,如果您为每个网格实例赋予不同的世界矩阵,则可以将它们全部放置在不同的位置并使用不同的比例和旋转。
viewProj
是视图和投影矩阵的组合,它们是根据您的相机和投影设置计算的,例如视图方向,位置/旋转,FOV,近/远平面等。
答案 1 :(得分:1)
阅读模型矩阵和查看矩阵。您可以使用对象坐标生成这些,然后将生成的矩阵传递给着色器,该着色器将为您移动网格。