加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转]三维向量旋转和向量投影公式

(2009-09-09 00:00:00)
标签:

杂谈



最近这两天没事的时候乱翻了翻加拿大人robert penner写的<Flash Mx编程与创意实现>(英文原名为programming macromedia flash mx>,讲的flash的版本是比较旧的了,不过书里的内容跟flash版本基本没关系,主要讲的是怎么把数学物理等知识应用到actionscript编程中,看完了确实是有不小收获,最恨的就是把当初数学课上学的那些定理基本上全忘光了,另外回想起当初,觉得中学的那帮子老师真的基本上都是只会空谈大论的家伙,讲的东西不是没用,其实是非常的有用(如果你用flash编程的话,你就能知道那些枯燥无聊的公式是多么多么的有用,当然还有其他方面的工作,但中学甚至到大学毕了业你可能都不知道它们怎么去解决实际的问题),但那帮子家伙除了会用那些东西去解决一堆子无聊枯燥狗屁用都没有的垃圾习题让我们去应付考试以外,基本上就不会别的了(不联系实际的理论是最无聊的东西,谁会有兴趣去学习让人觉得没实际意义的东西)。其实那些公式在实现各种动画效果上有决定性的作用。其实理论跟现实应用感觉只隔着一层纸一样,看了这书就有纸被捅破豁然开朗的感觉,会觉得原来这个以前学过的数学公式是这样使用的,这样用就能做出这样的效果等等。所以嘛,找老师一定要找明师(名师--那些所谓的著名教师未必都是名副其实),明师不非得是会说话的人,只要他(它)的思想能给你启发让你进步,那就是明师。好了,不废话了,下面就记录几个三维效果里面很基本的几个有用的公式吧(也许准确说不能算公式,不过也是从公式推导过来的,具有普遍性)。

三维向量旋转:
绕x轴旋转(以y,z都大于0的范围内从y轴向z轴方向旋转,旋转角度a,x不变):
function Rotate (a:Number)
{
rotatedY = y * cos(a) - z * sin(a)
rotatedZ = y * sin(a) + z * cos(a)
}

公式由来根据:2维向量的旋转,相当于绕Z轴旋转:
function Rotate (a:Number)
{
rotatedX = x * cos(a) - y * sin(a)
rotatedY = x * sin(a) + y * cos(a)
}
2维向量旋转公式是根据cos(a+b) = cos(a)* cos(b) - sin(a)*sin(b)和sin(a+b)=sin(a)*cos(b) + cos(a) * sin(b)这两个三角和公式推导而来。

同理绕y轴旋转(在x,z都为正的区域中由z向x方向旋转)的公式:
function Rotate (a:Number)
{
rotatedZ = z * cos(a) - x * sin(a)
rotatedX = z * sin(a) + x * cos(a)
}

绕z轴旋转同2维向量旋转

向量的投影(我没专业知识,只是取书中给出的方法记录于此以备没书的时候查阅用,我估计书里讲的是最简单一种,有不对的地方请别笑话,欢迎指证)
求物体的缩放比例:
视距(眼睛到投影面的距离)/ (z + 视距)
视距让效果产生类似窥视孔的那种效果

三维点的投影
projectedX = x * 缩放比例
projectedY = y * 缩放比例

利用以上公式可以在flash中实现物体(影片剪辑)的绕x,y,z三轴的旋转效果,也可以得出例如同时绕xy轴旋转的效果等等。我参照书中的示例,利用上面的公式制作出一个简单的绕X轴旋转的三维粒子墙的效果,感觉不错,效果挺逼真的,呵呵。

[来源网络]
http://hi.baidu.com/sai5d/blog/item/b01656503336e86b84352448.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有