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

标签 c++ opengl matrix scale

我正在尝试使用 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/

相关文章:

c++ - 当我构建我的项目时,visual studio 2008 没有创建 .exe 文件。任何想法为什么?

java - 使用游戏中的对象创建子弹

opengl - 什么时候需要使用 OpenGL 函数加载器?

c++ - 我想表达 2 x 2 矩阵的乘积

具有多个数组的 Numpy 元素加法

matlab - 两组之间均匀间隔的数字(向量化 LINSPACE)- MATLAB

c++ - 二维数组错误: Vector index beyond memory allocation

c++ - 类似于内核版本 2.6.9(或更低版本)的 inotify 的类似工具

c++ - 通用容器的输出流

c++ - 奇怪的访问冲突读取错误/glDrawArrays 使用