带有"up-"和"center-vec3"参数的glm::rotate()的有效替代方案?
Efficient alternative to glm::rotate() with "up-" and "center-vec3" arguments?
我正在开发一个 3D 引擎,我想使用一个"向上"向量和一个"标题"或"中心"向量作为 3D 对象的旋转位置的指标。 要为 OpenGL 着色器创建旋转矩阵,GLM 提供了函数 rotate(mat4((、弧度axis_of_rotation(。但是,由于我不跟踪axis_of_rotation,也不跟踪 3D 对象旋转的弧度数,所以我不能直接使用此功能。 目前我正在使用如下所示的自定义函数:
mat4 altRotate(vec3 center, vec3 up) {
GLfloat alpha_y = acos(dot(normalize(vec2(center.z, center.x)), vec2(1.0f, 0.0f)));
if (center.x < 0.0f)
alpha_y = -alpha_y;
mat4 Ry = {
cos(alpha_y), 0, sin(alpha_y), 0,
0, 1, 0, 0,
-sin(alpha_y), 0, cos(alpha_y), 0,
0, 0, 0, 1
};
center = vec3(Ry * vec4(center, 1.0f));
up = vec3(Ry * vec4(up, 1.0f));
GLfloat alpha_x = acos(dot(normalize(vec2(center.z, center.y)), vec2(1.0f, 0.0f)));
if (center.y > 0.0f)
alpha_x = -alpha_x;
mat4 Rx = {
1, 0, 0, 0,
0, cos(alpha_x), -sin(alpha_x), 0,
0, sin(alpha_x), cos(alpha_x), 0,
0, 0, 0, 1
};
center = vec3(Rx * vec4(center, 1.0f));
up = vec3(Rx * vec4(up, 1.0f));
GLfloat alpha_z = acos(dot(normalize(vec2(up.y, up.x)), vec2(1.0f, 0.0f)));
if (up.x < 0.0f)
alpha_z = -alpha_z;
mat4 Rz = {
cos(alpha_z), -sin(alpha_z), 0, 0,
sin(alpha_z), cos(alpha_z), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
return Ry * Rx * Rz;
}
然而,虽然我认为我可以提高这个功能的效率,但我有一种感觉,这个想法对于3D游戏引擎来说是低效的。 我试图理解lookAt函数,因为它的作用似乎与我的函数相似,但我不理解代码:
template <typename T, precision P>
GLM_FUNC_QUALIFIER tmat4x4<T, P> lookAtRH
(
tvec3<T, P> const & eye,
tvec3<T, P> const & center,
tvec3<T, P> const & up
)
{
tvec3<T, P> const f(normalize(center - eye));
tvec3<T, P> const s(normalize(cross(f, up)));
tvec3<T, P> const u(cross(s, f));
tmat4x4<T, P> Result(1);
Result[0][0] = s.x;
Result[1][0] = s.y;
Result[2][0] = s.z;
Result[0][1] = u.x;
Result[1][1] = u.y;
Result[2][1] = u.z;
Result[0][2] =-f.x;
Result[1][2] =-f.y;
Result[2][2] =-f.z;
Result[3][0] =-dot(s, eye);
Result[3][1] =-dot(u, eye);
Result[3][2] = dot(f, eye);
return Result;
}
我的问题是,是否已经有一个函数可以创建一个 mat4,将 vec3(0.0、0.0、1.0(旋转到标题和 vec3(0.0、1.0、0.0(向上旋转,或者至少有更有效的方法可以做到这一点?
好的,我的解决方案是使用 GLM 的 lookAt 代码,但删除 lins
Result[3][0] =-dot(s, eye);
Result[3][1] =-dot(u, eye);
Result[3][2] = dot(f, eye);
并删除眼睛/(位置(参数。 工作正常。 输出将与lookat(vec3(0.0f,0.0f,0.0f(,中心,向上(相同。
相关文章:
- 使用通常称为 API 实现C++多个客户和生产者解决方案,这是否有效?
- 带有"up-"和"center-vec3"参数的glm::rotate()的有效替代方案?
- 计算数的素数除数之和(非异数)直到 num 的有效替代方案
- 哪些有效的解决方案可以检查Arraya是否包含Arrayb的所有元素
- 是否有一种记忆有效的方法来探索从输入排列产生的解决方案
- 当仅恒定项之一变化时,线性系统AX = B的有效解决方案
- 对于同一循环的这两个连续组,是否有更有效的解决方案
- 遍历数组的简单任务.以下哪种解决方案最有效
- ZeroMQ 的替代方案是什么,用于移动协议缓冲区有效负载
- 将一维矩阵数组转换为主一维矩阵的有趣算法挑战,需要有效的解决方案
- 找到解决方案的最有效方法-C++
- 这是双重检查锁定的有效替代方案吗
- 我试图想出一个跨平台的 sleep() 替代方案,但我的代码不太有效
- 神经网络图像分类,最有效的解决方案/建议
- 如何想出这样的解决方案?(检查数独是否有效)
- 创建并返回字符串向量——最有效的解决方案
- 欧拉#5项目;这个解决方案有效 - 但为什么
- 给定一个范围,我必须计算数组中数字的频率.给定的解决方案是否有效
- 有效测试多个学生的编程解决方案
- 使用可变模板(或其他解决方案)有效地对数据施加结构