c - 如何构建世界模型矩阵

标签 c algorithm matrix raytracing

我目前正在开发我的第一个光线追踪器,我决定实现使用模型到世界矩阵将我的相机/主光线转换到模型空间中,以简化原始形状(包括球体、平面)的相交算法圆柱体和圆锥体。

以圆柱体为例,我想变换射线原点和方向来测试与高度为 1、半径为 1、位置 (0, 0, 0) 和方向/方位/旋转 ( 0, 1, 0)。 (xyz 格式,x 向右,y 向上,z 向远处)。

我还知道世界空间中的光线原点和方向。

如何确定任何类型圆柱体的世界模型变换矩阵? (示例:高度 2、半径 3、位置 (4, 5, 6) 和方向 (1, 2, 0))

我在正确解释圆柱体的方向和射线-圆柱体相交算法方面尤其遇到困难。

希望得到一些帮助!

请注意,我已经在网上对此进行了大量研究,矩阵不是我的强项,但我期待阅读您的建议/答案。

最后,我用 C 语言、SDL、math.h 和我自己的矩阵函数等来完成此操作...

爱! <3

最佳答案

在空间中定位和定向对象的最佳方法是为其设置一个四元数。它基本上包含给定空间(例如世界)中的位置和旋转信息。人们可以从一对简单的 vector (位置和方向)创建四元数。要应用存储在这样的四元数中的变换,必须根据它创建一个矩阵。在光线追踪的情况下,需要使用对象四元数的逆矩阵将光线转换到模型空间(从世界到模型空间的转换,假设光线位于世界空间中),在模型空间中进行相交,最后进行转换交点回到世界空间(与已经提到的、非逆四元数矩阵)。

这是理论。自己实现四元数是一件苦差事。最好使用一些现有的库,例如 GLM。确保它具有所需的功能 - 从一对 vector 创建四元数,将其转换为矩阵并反转矩阵/四元数。

关于c - 如何构建世界模型矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42303034/

相关文章:

c - OCaml 微基准测试

algorithm - 如何从IP地址计算子网掩码?

c# - 阵列阵列之间的距离

C 错误 : expected ';' , ',' 或 ')' 在 '...' token 之前

c - 需要换行字节来发送该数据

c - 函数中全局变量的malloc和realloc

algorithm - 选择总和为零的数字

python - 其字谜是回文的子串的数量

c++ - 如何将 std::vector 转换为 Eigen 中的矩阵?

r - 使用 R 创建完全对立的绘图