游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11061|回复: 7

请教:四维或者更高维向量的叉乘定义

[复制链接]

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2008-1-1 17:58:00 | 显示全部楼层 |阅读模式
叉乘的集合意义是已知道N维空间中的N-1个基向,可以求出与这N-1个基向量正交的另一个基向量吧.   
有的书上说叉乘只在3维上有定义,就是vec1和vec2相乘得:   
(vec1.y   *   vec2.z   -   vec1.z   *   vec2.y,   
vec1.z   *   vec2.x   -   vec1.x   *   vec2.z,   
vec1.x   *   vec2.y   -   vec1.y   *   vec2.x   )   
其实(我觉得)如果是2维的话那就是一个向量,求它的垂直向量就是叉乘了.   
4维向量的叉乘应该是3个向量相乘.按照某些网上的说法来说是这样定义的:   
V1   x   V2   x   V3   =   
                ¦i.   j.   k.   l. ¦   
                ¦x1   y1   z1   w1 ¦   
                ¦x2   y2   z2   w2 ¦   
                ¦x3   y3   z3   w3 ¦   
其中i,j,k,l是4维空间中的4个基向量.   
但我通过程序代码实现后发现测试不对.叉乘我是这么写的:   
inline   Vector4   Vector_Util::cross_product(const   Vector4&   vec1,   const   Vector4&   vec2,   const   Vector4&   vec3)   
{   
        /*   
        V1   x   V2   x   V3   =   
                ¦i.   j.   k.   l. ¦   
                ¦x1   y1   z1   w1 ¦   
                ¦x2   y2   z2   w2 ¦   
                ¦x3   y3   z3   w3 ¦   
        */   

        Real   a   =   vec1.x*vec2.y   -   vec1.y*vec2.x;   
        Real   b   =   vec1.x*vec2.z   -   vec1.z*vec2.x;   
        Real   c   =   vec1.x*vec2.w   -   vec1.w*vec2.x;   
        Real   d   =   vec1.y*vec2.z   -   vec1.z*vec2.y;   
        Real   e   =   vec1.y*vec2.w   -   vec1.w*vec2.y;   
        Real   f   =   vec1.z*vec2.w   -   vec1.w*vec2.z;   

        return   Vector4(   f*vec3.y   -   e*vec3.z   +   d*vec3.w,   
                                        f*vec3.x   +   c*vec3.z   -   b*vec3.w,   
                                        e*vec3.x   -   c*vec3.y   +   a*vec3.w,   
                                        d*vec3.x   +   b*vec3.y   -   a*vec3.z);   
}   

测试是随便找了3个不共面的向量比如:   
(1,2,3,4)(-4,-2,3,1)(10,-8,6,5)   
应该叉乘得到的向量始终是和这3个向量垂直的,也就是说和它们分别做点乘应该都是得到0.但为什么算出来老是不对么?   

(1,2,3,4)(-4,-2,3,1)(10,-8,6,5)这3个做叉集算出来是   
72,-63,266,-36   
这个,着实不知道怎么回事了     

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-1-1 18:34:00 | 显示全部楼层

Re:请教:四维或者更高维向量的叉乘定义

还真不知道>=4D的叉乘表示什么意义,顶一下,看看有没有知道的。

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2008-1-1 19:55:00 | 显示全部楼层

Re:请教:四维或者更高维向量的叉乘定义

恩,我觉得既然在3D中叉乘求给定两向量代表平面的法线,那在4D中也应该表示给定空间的法线么.
简单的说,3个不共面的向量可以构成一个空间的3个基,就可以代表一个空间了.那么4D中有4个基向量塞,4D的叉乘就是3个4维向量相乘,得到的一个4维向量应该就是和另外3个向量正交的么.也就是点乘的结果都为0啊.
在D3DXVec4Cross中也有是接受3个4D向量,求得一个向量的.我按照他给的说法来算了结果和上面的不符合^

3

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2008-1-1 20:44:00 | 显示全部楼层

Re: 请教:四维或者更高维向量的叉乘定义

楼主的理解是没有问题的,N维空间中N-1个线性无关向量确实可以求出唯一一个(方向上唯一)向量和这N-1个向量都正交,其实不用N-1个也可以,只是需要自己填充基向量。
叉积一般是针对3维空间的,所以说其他高维空间没有叉积也不算太错。
这种运算本质上是求代数余子式,在形式上我更喜欢把i j k l放在最后一行。
楼主的代码错误之处在于最后一步运算的符号问题,改成这样应该就可以了:
        return   Vector4(   f*vec3.y   -   e*vec3.z   +   d*vec3.w,   
                                        -(f*vec3.x   -   c*vec3.z   +   b*vec3.w),   
                                        e*vec3.x   -   c*vec3.y   +   a*vec3.w,   
                                        -(d*vec3.x   -   b*vec3.y   +   a*vec3.z));   

规律就是正负号是交叉的。(-1的N次方)

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-1-1 21:28:00 | 显示全部楼层

Re:请教:四维或者更高维向量的叉乘定义

在制作4dEngine时就搜索过,貌似数学上没有定义4d叉乘。。。
7d的叉乘是有的。

没办法,4d中的旋转,是围绕平面进行的。
比如,围绕xy平面旋转n度。

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2008-1-2 09:55:00 | 显示全部楼层

Re:请教:四维或者更高维向量的叉乘定义

汗,原来是算错的.
呵呵,真是谢谢各位了.现在搞对了

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-1-2 21:26:00 | 显示全部楼层

Re:请教:四维或者更高维向量的叉乘定义

哦,原来如此,真是三天不学习,赶不上刘少奇啊。

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2011-4-14 10:16:00 | 显示全部楼层

Re:请教:四维或者更高维向量的叉乘定义

学习了 原来这么多知识啊  一辈子都不够用啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 10:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表