我正在尝试将3D游戏引擎作为使用右手坐标系的现有图形API系统的渲染引擎。

游戏引擎通常在内部使用左手坐标系。

那么我该如何转换API参数,3d向量,转换矩阵和四元数?

在传递API之前,必须将API边界的右手版本转换为左手等效项到引擎API的较低层,然后必须将引擎的输出参数转换回高层API的右侧表示。

我在这里指的两个坐标系分别是,x指向右侧,y指向顶部,z指向远离眼睛(左手)并朝向或向后(右手) ),将眼睛放在原点或xy平面后面一定距离处,以使原点位于相机视图中。

示例:对于简单的3d点,转换步骤就是翻转z值的符号。

#1 楼

您可能需要的是这个4 x 4矩阵:

$$ \ mathtt {T} = \ begin {bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&-1&0 \\ 0&0&0&1 \\ \ end {bmatrix} $$
正在翻转z轴。此特定矩阵的逆是矩阵本身:
$ \ mathtt {T} ^ {-1} = \ mathtt {T} $

对于3D点$ \ mathbf {x} $从左边乘以:
$$ \ mathbf {x}'= \ mathtt {T} \,\,\ mathbf {x} $$
,对于3D变换,从右边乘以它:
$$ \ mathtt {P}'= \ mathtt {P} \,\,\ mathtt {T} $$

因此,您没有更改投影中的任何内容,原因是:
$$ \ mathtt {P}'\,\,\ mathbf {x}'= \ mathtt {P} \,\,\ mathtt {T} \,\,\ mathtt {T} \,\,\ mathbf {x} = \ mathtt {P} \,\,(\ mathtt {T} ^ {-1} \,\,\ mathtt {T})\,\,\ mathbf {x} = \ mathtt {P} \,\,\ mathbf {x} $$

四元数$ q =(s,x,y,z)^ \ top $可以转换为
具有以下内容的3D转换矩阵:

$$ \ mathtt {P} = \ begin {bmatrix} 1-2y ^ 2-2z ^ 2&2xy-2sz&2xz + 2ys&0 \\
2xy + 2sz&1 -2x ^ 2-2z ^ 2&2yz-2sx&0 \\
2xz-2sy&2yz + 2sx&1-2x ^ 2-2y ^ 2&0 \\ 0&0&0&1 \ end {bmatrix } $$
,然后可以像其他3D转换一样对待。

但是3D引擎它们通常在转换层次结构中应用转换。如果是这种情况,请确保仅修改“最接近”层次结构中3D点的3D变换。

资料来源:
图形编程I-3D变换|索斯滕·索马伦