矩阵旋转入门

首先,需要知道一个物体现有的宽度,高度和深度 —— 换句话讲,它是三个轴上每个轴分量的大小。当然可以建立一个 3×1 的矩阵:
w h d
我们知道 w, h, d 代表宽度(width),高度(height)和深度(depth)。下面需要缩放这个矩阵:
sx 0 0
0 sy 0
0 0 sz
首先,需要知道一个物体现有的宽度,高度和深度 —— 换句话讲,它是三个轴上每个轴分量的大小。当然可以建立一个 3×1 的矩阵:
w h d
我们知道 w, h, d 代表宽度(width),高度(height)和深度(depth)。下面需要缩放这个矩阵:
sx 0 0
0 sy 0
0 0 sz
这里 sx, sy, sz 是对应轴上的缩放比例。它们都将是分数或小数,1.0 为 100%,2.0 为 200%,0.5 为 50%,等等。稍后大家会看到为什么矩阵是用这种形式分布的。
要知道,矩阵乘法是为了让两个矩阵相乘,第一个矩阵的列数必需与另一个矩阵的行数相同。只要符合这个标准,第一个矩阵可以有任意多个行,第二个矩阵可以有任意多个列。本例中,由于第一个矩阵有三列(w, h, d),因此缩放矩阵就有三行。那么它们如何进行乘法运算呢?让我们来看一下这个模式:

 

  sx 0 0
w h d*0 sy 0
  0 0 sz

 

矩阵的计算结果如下:
(w*sx + h*0 + d*0) (w*0 + h*sy + d*0) (w*0 + h*0 + d*sz)

我们将第一个矩阵的第一行(u, v, w)与第二个矩阵每行的第一个元素相乘。将它们加起来就得到了结果的第一行的第一个元素。在第二个矩阵的第二列(b, e, h)中使用相同的方法就得到了第二列的结果。
如果第一个矩阵的行数大于 1,就要在第二行中重复上述动作,就会得到第二行的结果:

 

u v w a b c
x y z*d e f
  g h i
就得到了这个 3×2 的矩阵:
(u*a + v*d + w*g) (u*b + v*e + w*h) (u*c + v*f + w*i)
(x*a + y*d + z*g) (x*b + y*e + z*h) (x*c + y*f + z*i)
现在让我们看一些实际中用到的矩阵乘法 —— 坐标旋转。希望通过这个缩放的例子会让它看起来更加清晰。

使用矩阵进行坐标旋转
首先,要挖出我们的 3D 点矩阵:
x y z
它保存了该点所有的坐标。当然,还要有一个旋转矩阵。我们可以在三个轴的任意一轴上进行旋转。我们将分别创建每种旋转的矩阵。先从 x 轴旋转矩阵开始:
1 0 0
0 cos sin
0 -sin cos
这里有一些正余弦值,“sin 和 cos 是什么?”很明显,这就是我们要旋转的角度的正余弦值。如果让这个点旋转 45 度,则这两个值就是 45 的正弦和余弦值。(当然,在代码中要使用弧度制)现在,我们让该矩阵与一个 3D 点的矩阵相乘,看一下结果。

 

  1 0 0
x y z*0 cos sin
  0 -sin cos
由此得到:
(x*1 + y*0 + z*0) (x*0 + y*cos - z*sin) (x*0 + y*sin + z*cos)
整理后结果如下:
(x) (y*cos - z*sin) (z*cos + y*sin)
这句话用 ActionScript 大略可以翻译成:
x = x;
y = Math.cos(angle) * y - Math.sin(angle) * z;
z = Math.cos(angle) * z + Math.sin(angle) * y;
回忆一下第十章,在讨论坐标旋转时,我们会看到这实际上就是 x 轴的坐标旋转。不要惊讶,矩阵数学只是观察和组织各种公式和方程的不同方法。至此,要创建一个 y 轴旋转的矩阵就非常容易了:
cos 0 sin
0 1 0
-sin 0 cos
最后,z 轴的旋转为:
cos sin 0
-sin cos 0
0 0 1
这是一个很好的尝试,用 x, y, z 的矩阵乘以每个旋转矩阵的单位,证明所得到的结果与第十章的坐标旋转公式完全相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
OpenSceneGraph是一个开源的高性能3D图形工具包,用于开发虚拟现实、增强现实、模拟和游戏等应用程序。以下是OpenSceneGraph的快速入门指导: 1. 下载和安装:首先,从OpenSceneGraph的官方网站下载适用于您的操作系统的最新版本。然后,按照官方文档提供的步骤进行安装。 2. 设置环境:在使用OpenSceneGraph之前,您需要设置环境变量。这涉及到将OpenSceneGraph的安装路径添加到系统的PATH变量中。这样,您就可以在命令行或脚本中调用OpenSceneGraph的命令和库文件。 3. 创建场景:在OpenSceneGraph中,使用场景图来描述3D场景。一个场景图由多个节点组成,每个节点代表一个对象、光源或相机。可以使用OpenSceneGraph提供的代码来创建和组织这些节点。例如,使用osg::Group创建一个节点,并使用osg::Geometry创建一个表示几何形状的节点。 4. 加载模型:OpenSceneGraph支持加载各种3D模型文件格式,如OBJ、3DS和COLLADA等。使用OpenSceneGraph提供的加载器类,可以轻松加载这些模型文件并将其添加到场景图中。 5. 设置相机和视图:在OpenSceneGraph中,相机用于定义视图和投影矩阵。您可以通过创建osg::Camera对象,并设置其位置、方向和投影等属性来定义相机。然后,将相机节点添加到场景图中,并将其与视口相关联以确保正确的渲染效果。 6. 渲染场景:使用OpenSceneGraph的渲染器类来执行场景的实时渲染。您可以创建osgViewer::Viewer对象,并将场景图传递给其场景根节点。然后,调用viewer.run()方法来启动渲染循环并显示场景。 7. 处理用户输入:OpenSceneGraph提供了处理用户输入的功能。您可以使用osgGA::TrackballManipulator类来实现相机的交互式控制,如旋转、平移和缩放等。您还可以自定义处理键盘和鼠标事件的代码。 通过按照上述步骤和参考官方文档,您可以快速入门使用OpenSceneGraph开发高性能的3D图形应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值