使用OpenGL将网格移动到给定位置

时间:2013-03-28 13:24:56

标签: java c++ opengl 3d

如果您在使用Actionscript之前已经熟悉了影片剪辑的工作原理,那么它们可以设置宽度,高度,x,y值,并且更改它们非常简单。

但是现在,我尝试使用libgdx(Java)& LibCinder(C ++)并且有很多内容,渲染现在通过OpenGL完成,并且需要着色器等', 我设法导入了一个我用它的纹理创建的3d网格,但现在在改变网格的位置/大小方面有点奇怪..

在我试图使用的两个库中,没有真正的方法来改变网格的大小或位置,就像我想的那样。 (起初,我期待像mesh.width / height,mesh.scale,mesh.x / y / z这样的东西)

所以我的问题是,设置这些值的实际方法是什么?

2 个答案:

答案 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)

阅读模型矩阵和查看矩阵。您可以使用对象坐标生成这些,然后将生成的矩阵传递给着色器,该着色器将为您移动网格。

http://www.songho.ca/opengl/gl_transform.html