现代计算机图形学02---3D变换


闫令琪老师的网站:
https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

有了二维空间的变换基础以后,三维的就容易理解了。
对于三维空间的变换,同样需要采用齐次坐标(homogeneous coordinates)的方式来处理。

  • 3D point = (x, y, z, 1)T
  • 3D vector = (x, y, z, 0)T

行优先和列优先

一个点或者向量其实有两种写法:

  • point = (x, y, z),行优先,即1*3矩阵
  • point = (x, y, z)T,列优先,即3*1矩阵

为什么先提出这种差别,因为这个涉及到后面的矩阵相乘运算次序问题。
对于行优先的点,即1*3矩阵,想要进行矩阵变换之后得到新的点,则只能点右边乘一个3*3的矩阵;
对于列优先的点,即3*1矩阵,想要进行矩阵变换之后得到新的点,则只能点左边乘一个3*3的矩阵;
如果期望对一个点先进行缩放S,再进行旋转R,最后进行偏移转换T,则:
已知的Revit和Rhino中的点和向量,都是列优先,所以对点/向量进行坐标变换的写法是:
对于列优先:P新 = T*R*S*P,即从右往左开始逐个应用
对于行优先:P新 = P*S*R*T,即从左往右开始逐个应用
Revit、Rhino中的矩阵都是使用的列优先,glTF格式中也是采用的列优先。
了解了列优先或者行优先,才能明确不同的开发软件如今进行复合矩阵的计算。
Tips:
列优先或者行优先完全不影响矩阵的书写方式,比如glTF中,即使定义了是列优先,但是一个偏移矩阵的数组表达仍然是行的方式:

"matrix" :
[
 1, 0, 0, 0,
 0, 1, 0, 0,
 0, 0, 1, 0,
 Tx,Ty,Tz,1
]

一般形式

采用4*4的矩阵:
[ x ′ y ′ z ′ 1 ] = [ a b c t x d e f t y g h i t z 0 0 0 01 ] [ x y z 1 ] \left[ \begin{matrix} x' \\y' \\z'\\1 \end{matrix} \right] = \left[ \begin{matrix} a & b & c& tx\\ d & e & f& ty\\ g & h & i& tz\\ 0 & 0 & 0 & 01 \end{matrix} \right] \left[ \begin{matrix} x \\y \\z\\1 \end{matrix} \right] xyz1 = adg0beh0cfi0txtytz01 xyz1

缩放

[ s 1 0 0 0 0 s 2 0 0 0 0 s 3 0 0 0 0 1 ] \left[ \begin{matrix} s1 & 0 & 0& 0\\ 0 & s2 & 0& 0\\ 0 & 0 & s3& 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] s10000s20000s300001
在Revit中,缩放比较少见,即使有,3个坐标轴的缩放比例也是相等的,即s1=s2=s3等比例缩放。

平移

[ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] \left[ \begin{matrix} 1 & 0 & 0& tx\\ 0 & 1 & 0& ty\\ 0 & 0 & 1& tz\\ 0 & 0 & 0 & 1 \end{matrix} \right] 100001000010txtytz1

旋转

1.绕x轴旋转

x轴保持不变:
[ 1 0 0 0 0 c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 ] \left[ \begin{matrix} 1 & 0 & 0& 0\\ 0 & cos\theta &-sin\theta& 0\\ 0 & sin\theta &cos\theta& 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] 10000cosθsinθ00sinθcosθ00001

2.绕y轴旋转

y轴保持不变:(注意和x轴旋转与y轴旋转的规律不一样)
[ c o s θ 0 s i n θ 0 0 1 0 0 − s i n θ 0 c o s θ 0 0 0 0 1 ] \left[ \begin{matrix} cos\theta & 0 &sin\theta& 0\\ 0 & 1 &0& 0\\ -sin\theta & 0 &cos\theta& 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] cosθ0sinθ00100sinθ0cosθ00001

3.绕z轴旋转

z轴保持不变:
[ c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 0 0 0 0 1 ] \left[ \begin{matrix} cos\theta & -sin\theta & 0& 0\\ sin\theta & cos\theta &0& 0\\ 0 & 0 &1& 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] cosθsinθ00sinθcosθ0000100001

Revit中的坐标系

​​​​​​在这里插入图片描述
第1列:BasisX;第2列:BasisY;第3列:BasisZ;第4列:Origin。

其实不仅仅是在Revit中,其他如gltf、opengl等三维数据格式都是以相同的方式来表示。(不过gltf中对应的matrix书写上是行和列交换了一下)。

Revit到glTF坐标系转换

在这里插入图片描述
上图左边是gltf坐标系,右边是revit坐标系。
要实现revit坐标系到gltf坐标系的转换,只需要绕着X轴逆时针旋转90度即可:
[ 1 0 0 0 0 c o s 9 0 ∘ − s i n 9 0 ∘ 0 0 s i n 9 0 ∘ c o s 9 0 ∘ 0 0 0 0 1 ] = [ 1 0 0 0 0 0 − 1 0 0 1 0 0 0 0 0 1 ] \left[ \begin{matrix} 1 & 0 & 0& 0\\ 0 & cos90^{\circ} &-sin90^{\circ}& 0\\ 0 & sin90^{\circ} &cos90^{\circ}& 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] =\left[ \begin{matrix} 1 & 0 & 0& 0\\ 0 & 0 &-1& 0\\ 0 & 1 &0& 0\\ 0 & 0 & 0 & 1 \end{matrix} \right] 10000cos90sin9000sin90cos9000001 = 1000001001000001

// 坐标系(基)变换矩阵
var transform = Transform.CreateRotation(XYZ.BasisX, Math.PI / 2);

那么将revit坐标系中的点转换为gltf坐标系中的点坐标,对应的转换矩阵为:

// 坐标变换矩阵 = 基变换矩阵的逆矩阵
var totalTr = transform.Inverse;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是计算机图形学关于三维变换与投影的常见问题及其答案: 1. 什么是三维变换? 三维变换是指对三维空间的对象进行平移、旋转、缩放等操作,以改变其在三维空间的位置、方向和大小。 2. 三维变换有哪些类型? 三维变换包括平移变换、旋转变换、缩放变换、剪切变换等。 3. 三维变换如何表示? 三维变换可以使用矩阵来表示。通常使用4x4的变换矩阵,其前三行表示变换后的x、y、z坐标轴,第四行表示平移向量。 4. 什么是视图变换? 视图变换是指将三维物体从不同的角度和位置观察时的变换。常用的视图变换包括平移、旋转、缩放和投影等。 5. 什么是投影变换? 投影变换是将三维物体投影到二维平面上的过程。常用的投影方式包括正交投影和透视投影。 6. 正交投影和透视投影有什么区别? 正交投影是指将物体投影到一个平行于某个坐标轴的平面上,物体在投影后大小不会改变。透视投影是指将物体投影到一个斜截面上,物体在投影后大小会发生变化。 7. 什么是视口变换? 视口变换是将投影后的图像映射到屏幕上的过程。视口变换通常包括平移、缩放和旋转等操作。 8. 三维变换和投影在计算机图形学有什么应用? 三维变换和投影在计算机图形学广泛应用于三维建模、游戏开发、动画制作、虚拟现实等领域。通过对三维物体进行变换和投影,可以实现逼真的三维场景渲染,提高用户的交互体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值