从单个/两个向量构建一组正交基底

来自《Fundamentals of computer graphic》2.4.6 和 2.4.7。

从单个向量构造基底

我们经常需要一组与某个给定向量对齐的正交基底。
即,给定一个向量 a \mathbf{a} a,我们需要一组正交向量 u , v , w \mathbf{u},\mathbf{v},\mathbf{w} u,v,w
其中 w \mathbf{w} w a \mathbf{a} a有相同的方向,但是我们不关心 u , v \mathbf{u},\mathbf{v} u,v具体是什么。一个向量不足以唯一地确定基底,我们只是需要一种鲁棒的机制来找到其中任意一种可能基底。
 
首先,使得 w \mathbf{w} w a \mathbf{a} a 方向上的一个单位向量:
w = a ∥ a ∥ \mathbf{w}=\frac{\mathbf{a}}{\| \mathbf{a} \|} w=aa
然后,选取同 w \mathbf{w} w 不共线的任意一个向量 t \mathbf{t} t,如下构建一个正交于向量 w \mathbf{w} w 的单位向量 u \mathbf{u} u:
u = t × w ∥ t × w ∥ \mathbf{u} = \frac{\mathbf{t} \times \mathbf{w}}{ \|\mathbf{t} \times \mathbf{w}\| } u=t×wt×w

叉积交换顺序也可以,但是需要确定得到的基底是右手坐标系。

如果 t \mathbf{t} t w \mathbf{w} w共线或者接近共线,结果都不准确。
一个简单的机制是从 w \mathbf{w} w 开始构造 t \mathbf{t} t,首先令 t \mathbf{t} t 等于 w \mathbf{w} w,然后将其分量中绝对值最小的分量改为 1。
举个例子,如果 w = ( 1 / 2 , − 1 / 2 , 0 ) \mathbf{w} =(1/\sqrt{2},-1/\sqrt{2},0) w=(1/2 ,1/2 ,0),那么, t = ( 1 / 2 , − 1 / 2 , 1 ) \mathbf{t} =(1/\sqrt{2},-1/\sqrt{2},1) t=(1/2 ,1/2 ,1)
在知道 w \mathbf{w} w u \mathbf{u} u后,
v = w × u \mathbf{v} = \mathbf{w} \times \mathbf{u} v=w×u
使用这种构造方法的一个场景是表面上色。一组和表面法线对齐的基底是需要的,但是关于发现的旋转是不重要的。

从两个向量构造基底

一个常见的例子是为一个相机构造一组基底;沿着相机看的方向有一个对齐的向量是重要的,但是围绕这个向量的旋转并不是任意的,而且这需要以某种方式指定。一旦确定了旋转,这组基底就完全决定了。
完全指定一帧的方法是通过提供两个向量 a \mathbf{a} a(指定 w \mathbf{w} w)和 b \mathbf{b} b(指定 v \mathbf{v} v)。如果这两个向量是正交的,那么构造第三个向量的简单的方法是通过 u = b × a \mathbf{u}=\mathbf{b} \times \mathbf{a} u=b×a

u = a × b \mathbf{u}=\mathbf{a} \times \mathbf{b} u=a×b 也是构造一组正交基,但是这是左手坐标系。

为了得到正交基底,即使输入的向量不正交,我们需要如下操作:
w = a ∥ a ∥ \mathbf{w} = \frac{\mathbf{a}}{\| \mathbf{a}\|} w=aa
u = b × w ∥ b × w ∥ \mathbf{u} = \frac{\mathbf{b} \times \mathbf{w}}{ \|\mathbf{b} \times \mathbf{w}\| } u=b×wb×w
v = w × u \mathbf{v} = \mathbf{w} \times \mathbf{u} v=w×u
如果 a \mathbf{a} a b \mathbf{b} b平行,上述方法失效。在这种情况下, b \mathbf{b} b对于选择我们应该使用的与 a \mathbf{a} a 正交的方向没有帮助。

在指定摄像机位置的例子中(本书 Section 4.3),我们想要构造一个帧:拥有平行于摄像机所观察的方向 w \mathbf{w} w,并且 v \mathbf{v} v应该指向摄像机的顶部。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您想了解如何使用MyBatis新增两个字段,一个是数组,一个是单个参数。首先,您需要在MyBatis的mapper文件中编写插入语句,语句中需要包含这两个字段。例如: ```xml <insert id="insertData" parameterType="com.example.Data"> INSERT INTO data (name, age, hobbies) VALUES (#{name}, #{age}, #{hobbies}) </insert> ``` 在这个例子中,插入语句中包含三个字段:name、age和hobbies。其中,name和age是单个参数,可以直接使用#{}来引用。而hobbies是一个数组,需要使用MyBatis提供的foreach标签来循环插入。例如: ```xml <insert id="insertData" parameterType="com.example.Data"> INSERT INTO data (name, age, hobbies) VALUES (#{name}, #{age}, <foreach collection="hobbies" item="hobby" separator=","> #{hobby} </foreach> ) </insert> ``` 在这个例子中,我们使用了foreach标签来循环插入hobbies数组中的每个元素。其中,collection属性指定了要循环的数组,item属性指定了循环中的变量名,separator属性指定了每个元素之间的分隔符。 在Java代码中,您可以创建一个Data对象来传递参数。例如: ```java Data data = new Data(); data.setName("John"); data.setAge(30); data.setHobbies(new String[] {"reading", "swimming", "travelling"}); dataMapper.insertData(data); ``` 在这个例子中,我们创建了一个Data对象,并设置了name、age和hobbies属性。然后,我们调用dataMapper的insertData方法来插入数据。MyBatis会自动将Data对象中的属性映射到插入语句中的对应位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

培之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值