gpt4 book ai didi

c++ - 如何沿任意轴缩放对象(在 3D 空间中)

转载 作者:行者123 更新时间:2023-11-30 04:15:40 26 4
gpt4 key购买 nike

我正在尝试使用 opengl 用 C++ 编写一个物理模拟器,我需要能够沿着相机所面对的轴缩放对象(现在主要是立方体)。

我可以使用它作为我的模型矩阵完美地绘制对象:

mat4 Model = Translate(cube.Position - float3(gl.Position.x, gl.Position.y, -gl.Position.z)) * Rotate(cube.Rotation) * Scale(cube.Scale);

其中 gl.Position 是凸轮的位置,float3 是一个 vec3,就像我写的类,等等......

所以我尝试修改该行以在其他所有内容之前包含一个比例因子(首先应用末尾的内容):

mat4 Model = Translate(cube.Position - float3(gl.Position.x, gl.Position.y, -gl.Position.z)) * Rotate(cube.Rotation) * Scale(cube.Scale) * (Rotate(float3(gl.Rotation.x, gl.Rotation.y, gl.Rotation.z)) * Scale(float3(1.0f, 1.0f, sqrt(1 - (velocity * velocity)))) * Rotate(float3(tau - gl.Rotation.x, tau - gl.Rotation.y, tau - gl.Rotation.z)));

这是重要的最后一部分,我旋转对象,缩放它,然后将其旋转回来.. sqrt(1 - (velocity * velocity)) 是物理部分(洛伦兹收缩),gl.Rotation 是一个 vec3,其中每个轴都以凸轮的弧度表示俯仰、偏航和滚动。我的平移、旋转等功能正常工作,但我需要有关创建可缩放矩阵的理论方面的帮助。

最佳答案

缩放矩阵的形式为:

{{s_x, 0, 0, 0},
{0, s_y, 0, 0},
{0, 0, s_z, 0},
{0, 0, 0, 1}}

假设统一坐标。

要应用它们,您需要先缩放,然后旋转,然后平移。我建议使用 gl 函数来执行此操作。假设您希望对象位于 x、y、z 位置,并且它的旋转在四元数 {theta, r_x, r_y, r_z} 中。缩放和旋转需要发生在模型坐标系中。 GL 以适当的顺序应用转换,因此其代码如下所示:

glTranslatef(x, y, z);
glRotatef(theta, r_x, r_y, r_z);
glScalef(s_x, s_y, s_z);

//draw my model

关于c++ - 如何沿任意轴缩放对象(在 3D 空间中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com