0

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

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

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

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

4

2 回答 2

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、近/远平面等)计算得出的。

于 2013-03-28T13:45:17.437 回答
1

读入模型矩阵和视图矩阵。您使用对象坐标生成这些,然后将生成的矩阵传递给将为您移动网格的着色器。

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

于 2013-03-28T13:44:49.123 回答