首页 > 范文大全 > 正文

基于平面的三维空间物体任意点移动算法

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于平面的三维空间物体任意点移动算法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:为优化虚拟三维管理领域的物体移动操作,实现利用鼠标完成物体在三维空间中任意点的移动过程,引入可移动平面的概念,在三维空间建立垂直于视线在xz平面投影的可移动平面;建立1条从摄像机位置到鼠标位置的射线,由鼠标滚轮控制可移动平面在视线方向上的前后移动;通过移动可移动平面,使鼠标射线与可移动平面的交点可以到达三维空间中的任意位置;计算射线与可移动平面的交点坐标,将其作为待移动物体新坐标放入渲染流水线,从而完成物体移动. 实际应用表明,该算法在保证移动速度与精度的同时可减少移动所需的输入设备.

关键词:DirectX; 可移动平面; 三维移动; 鼠标射线; 射线变换

中图分类号:TP317.4;TP391.73文献标志码:A

Arbitrary movement algorithm of objects in

3D space based on plane

SONG Jihong, LI Fenglong, XU Quansheng

(Info. Sci. & Eng. College, Shenyang Univ. of Tech., Shenyang 110178, China)

Abstract: To optimize the operation of movement of objects in virtual 3D management field and realize the process of using mouse to complete the object movement to any point in 3D space, the concept of movable plane is introduced into the study. A movable plane is built that is perpendicular to the projection of sightline in xz plane; a radial from camera position to mouse point is built and the mouse wheel is used to control the forward and backward movement of the movable plane along the sightline direction; the intersection point of the mouse radial and the movable plane can be moved to any position in 3D space by moving the moveable plane; the coordinate of the intersection point of the radial and the moving plane is calculated, taken as the new coordinate of the object to be moved which is added into the romance pipeline, and the object movement can be implemented. The application shows that the algorithm can ensure the movement accuracy and speed of the objects and reduce the input devices that help to move objects.

Key words: DirectX; movable plane; 3D moving; mouse radial; radial counterchange

收稿日期:2009-02-18修回日期:2009-05-08

作者简介: 宋继红(1968―),女,辽宁福县人,副教授,研究方向为计算机网络通信、计算机网络远程控制、虚拟现实技术,

(E-mail)

0引言

在计算机技术高速发展的今天,虚拟现实(Virtual Reality,VR)技术作为1门综合计算机图形、多媒体、传感器、人机交互、网络、立体显示以及仿真等多种技术而发展起来的计算机领域的新技术正逐步走向成熟并得到广泛应用.[1]VR本质上是1种先进的计算机用户接口,它通过给用户同时提供诸如视觉、听觉、触觉等各种直观而又自然的感知交互手段,最大限度地方便用户操作,从而减轻用户负担,提高整个系统的工作效率.[2]因其在管理领域中所具有的独特优势,近几年VR正逐渐被应用到各种管理领域.特别是在建筑、仓储等管理领域中,传统的窗口式管理软件已不能满足用户需要,人们希望能对数据进行可视化管理,从感观上对仓库中的物品进行管理.因而,VR技术成为数据可视化管理的首选.当VR技术应用于建筑、仓储等管理领域中时,实现物体在虚拟三维场景中的移动成为实现VR技术在该领域应用的基础.因为在三维环境中多了深度信息,反映到坐标系上就增加了z方向的坐标值,从而使得一些在二维空间交互的简单问题到三维空间就变得非常复杂.[3]利用鼠标、触摸板等二维输入设备得到的输入信息只具有x和y方向的二维信息,要实现在三维环境下的物体移动,首先需要解决将二维屏幕上的鼠标点坐标变换为三维场景中的三维坐标.[4]但是,直接利用鼠标获取输入点的高度信息十分困难.最初的三维空间物体移动方案利用键盘等输入设备在三维空间通过在x,y,z 3个坐标增加或减少1个固定值完成,这种方法不但耗费移动时间,而且因其在x,y,z轴上每次只可移动1个固定值,移动精度很难保证.因此,实现通过鼠标控制完成二维屏幕的三维移动操作对VR技术应用于虚拟三维管理工作上具有极其重要的意义.

1基于面的三维空间物体任意移动算法

在三维空间中建立垂直于视线在xz平面投影的可移动平面,并建立从摄像机位置,到鼠标位置的射线.计算射线与可移动平面的交点,将其放入渲染流水线作为待移动物体的新坐标值从而完成三维物体的移动.此算法可分解为以下5步:(1)建立可移动平面;(2)建立鼠标射线;(3)拾取物体确定待移动物体;(4)对平面进行移动;(5)计算射线与移动平面交点.

1.1建立可移动平面

通过3点可确定1个平面,该平面要满足以下要求:(1)平面要通过物体重心;(2)平面垂直于xz平面;(3)平面垂直于视线在xz平面的投影.定义P1点为物体重心点,可通过查看物体的当前位置信息获得P1点.设该重心中点垂直上方点为P2, 其坐标为(xP1,yP1+10,zP1).为使平面垂直于视线在xz平面上的投影,此时只需再在xz平面上找到1点P3,即可得到向量A(P1,P2)与向量B(P0Eye,P0vLook),使向量A与B满足A×B=0(1)因P3点在xz平面上,所以yP3=0,又因P3点在x轴上的坐标只要不与P1点在x轴重合,即可建立满足要求的平面,所以设P3=(10 000,0,h), zP3为待求值.由式(1)得

(xP1-xP3)×(xP0vEye-xP0vLook)+

(zP1-zP3)×(zP0vEye-zP0vLook)=0

zP3=zP1(xP1-xP3)×(xP0vEye-xP0vLook)(zP0vEye-zP0vLook)

此时,由已确定的P1,P2和P3点可确定唯一平面.定义向量A,B,C:A=P2-P1;B=P2-P3.利用DirectX SDK库函数D3DXVec3Cross()计算A和B所在平面的法向量: D3DXVec3Cross(C,A,B),所以过P1,P2,P3的平面方程为xc(x-xp1)+yc(y-yp1)+zc(z-zp1)=01.2建立鼠标射线

当按下鼠标并移动到屏幕上的点S时,从屏幕上可想象出1条从摄像机位置到鼠标点处的射线.然而,应用程序不可能仅仅根据得到的屏幕点S的坐标建立这条射线.[5]与二维图形程序的显示方式不同,三维图形程序中的顶点要经过世界变换、摄像机变换、投影变换、剪切以及视口缩放,才能在二维屏幕上显示.[6]为获取鼠标按下点的造型空间坐标,利用造型空间和用户空间之间的坐标变换提取空间坐标.[7]设在投影窗口上与S点对应的点为P,投影面为z=1.建立1条射线,使其从投影空间起点出发穿过点P.建立射线的算法可分解为以下3步:(1)捕捉屏幕上点S,确定S点对应投影窗口上的点P;(2)建立1条从投影坐标系原点出发穿过点P的射线;(3)将射线和模型变换到同一坐标系中.

1.2.1屏幕到投影窗口变换

视口变换矩阵[8]为w2000

0-h200

00zmax-zmin0

x+w2y+h2zmin1投影窗口上的点P通过视口变换产生屏幕上的点S:xs=xpw2+x+w2(2)

ys=yph2+y+h2(3)z坐标在视口变换以后没有作为二维图像的一部分存储被存储到深度缓存中.[9]因此,由式(2)和(3)得到计算xp的式(4)和计算yp的式(5).xp=2xs-2x-ww(4)

yp=-2ys+2y+hh(5)通常情况下,视口中的x和y为0,因此能更进一步得到xp=2xsw-1(6)

yp=-2ysh+1(7)由定义可知,投影窗口就是z=1的平面,因此zp=1(8)投影矩阵缩放投影窗口上的点以适应不同大小的观察视野.为了得到被缩放之前点的值,必须通过缩放变换的逆运算来变换点.设P为投影矩阵,因为变换矩阵的P00和P11是点的x坐标和y坐标的缩放值,所以被缩放之前点的值为xp=2xw-11P00(9)

yp=-2yh+11P11(10)此时点P为屏幕上点S对应投影窗口上的点.

1.2.2建立射线

射线可以表示为等式P(r)=P0+tu,其中,P0是射线的起点位置,u是用于描述射线的方向向量.在前面设定射线的起点为投影空间的起点,因此p0=(0, 0, 0).因为射线通过点P,所以方向向量u可表示为u=P-P0=(xp,yp,1)-(0,0,0)=P.采用上述方法在Direct3D中计算射线.首先定义射线结构体RAY,

Struct RAY

{

D3DXVERCTOR3 Origin;

D3DXVERCTOR3 Direction;

}

创建RAY类型全局变量Ra,其中变量Origin和Direction分别用于存储射线的起点和方向.定义函数GetRay(int x,int y)计算射线.在函数中声明D3DVIEWPORT9 类型结构体Viewport和D3DXMATRIX 类型矩阵Proj.用 pd3dDevice->GetViewport(&Viewport)将视口信息存储于Viewport中,用pd3dDevice->GetTransform(D3DTS_PROJECTION, &Proj)获取投影矩阵,并用Proj返回.根据式(9)和(10)计算出xp和yp,可得射线的起点为D3DXVECTOR3(0.0f,0.0f,0.0f),射线的方向为D3DXVECTOR3(xp,yp,1.0f),最后函数返回射线Ra.

1.2.3射线变换

在第1.2.2节中计算出来的射线是在投影空间中描述的.为了完成射线与第1.1节中建立的移动平面相交,射线和移动平面必须在同一坐标系内.与其将移动平面转换到视图空间中,不如将射线转换到世界空间.[10]通过变换矩阵来改变射线P(r)=P0+tu中的起点P0和方向u,进而实现对射线的变换.定义函数TransformRay(Ray*ray, D3DXMATRIX* T)变换射线.其中,采用函数D3DXVec3TransformCood变换射线起点,第4个分量缺省为1;采用函数D3DXVec3TransformNormal变换射线方向,第4个分量缺省为0.这里,起点作为1个点变换,方向作为1个向量变换.至此,在待移动物体所在的世界坐标系中可得到1条从摄像原点出发并经过鼠标在世界坐标系下对应点的射线Ra.

1.3拾取物体确定待移动物体

通过第1.2节计算得到的射线原点与方向向量,利用DirectX SDK D3DXIntersect()函数逐一判断场景中的物体是否被拾取,以确定待移动物体.函数原型为: D3DXIntersect( pMesh, &vPickRayOrig,&vPickRayDir,&bHit,NULL,NULL,NULL,NULL,NULL,NULL) [11]; 通过bHit返回值是否为1判定物体是否被拾取.利用该函数可以一次性拾取到射线所穿过的几个物体,此时可通过提取物体在三维场景中的位置信息Place[i],并计算找出距摄像机距离最小的物体为拾取物体.

1.4对平面进行移动

前面建立的平面只能实现物体在1个平面上移动,要实现物体在整个三维空间移动需要让该平面在视线方向上向前或向后移动.如图1所示,在xz平面内可移动面可表示为1条直线.要把可移动面从面1位置移动到面2位置只须让面1中的各点分别在z轴和x轴方向上移动1个单位即可.图中视线的方向向量OE=(P0vEye-P0vLook);角α为向量OE与x轴的夹角;d为移动距离.由图可得Δx=d cos α,z=d sin α所以移动后P1,P2,P3的点坐标分别为P4=(xp1+d cos α,yp1,zp1+d sin α)

p5=(xp2+d cos α,yp2,zp2+d sin α)

p6=(xp3+d cos α,yp3,zp3+d sin α)再将P4, P5, P6赋值给P1, P2, P3.

图 1可移动平面变换

采用上述方法在Direct3D中计算.首先定义函数PlanMove(int i),在此函数中完成以上功能,其中参数i用于控制平面向前移动还是向后移动.该函数响应鼠标滚轮事件WM_MOUSEWHEEL,当向前滚动时,使移动距离d>0,反之d

由于第1和2节已建立从摄像原点到鼠标在世界坐标系对应点的射线和垂直于视线在xz平面上投影的可移动平面,所以下一步只要计算射线与可移动平面的交点,得出交点值,将其作为世界坐标系下待移动物体的新坐标,装入渲染流水线即可完成对物体的移动.交点值的计算过程如下:

xc(x-xp1)+yc(y-yp1)+zc(z-zp1)=0

x=xOriginRa+xDirectionRa×t

y=yOriginRa+yDirectionRa×t

z=zOriginRa+zDirectionRa×t

式中:t为参数方程的参数.解方程得t=xc(xp1-xOriginRa)+yc(yp1-yOriginRa)+zc(zp1-yOriginRa)xc×xDirectionRa+yc×yDirectionRa+zc×zDirectionRa

x=xOriginRa+xOriginRa×xc(xp1-xOriginRa)+yc(yp1-yOriginRa)+zc(zp1-yOriginRa)xc×xDirectionRa+yc×yDirectionRa+zc×zDirectionRa

y=yOriginRa+yOriginRa×xc(xp1-xOriginRa)+yc(yp1-yOriginRa)+zc(zp1-yOriginRa)xc×xDirectionRa+yc×yDirectionRa+zc×zDirectionRa

z=zOriginRa+zOriginRa×xc(xp1-xOriginRa)+yc(yp1-yOriginRa)+zc(zp1-yOriginRa)xc×xDirectionRa+yc×yDirectionRa+zc×zDirectionRa此交点值为鼠标射线与移动平面的交点坐标,即待移动物体的新坐标值.将该点装入渲染流水线作为待移动物体的坐标,到此完成物体在三维空间中的移动.

2实验结果

上述算法在PC机(AMD Athlon 64 Processor 3000+处理器,1 GB内存,NVIDIAGeForce 6600LE显卡)上利用Direct3D 9.0c (AGU2006)图形库实现.在场景中,当物体被拾取到后,通过拖动鼠标可以使物体在初始移动平面上自由移动.当滚动鼠标滚轮,物体可在新建立的移动平面上自由移动从而达到通过鼠标使物体在三维空间中作任意位置移动的目的.图2为相关示例.

图 2算法实践

3结束语

为改进物体在三维空间的移动操作,从建立可移动平面和鼠标射线出发,通过移动可移动平面,使鼠标射线与可移动平面的交点可以到达三维空间中的任意位置,而后将该位置坐标作为待移动物体新坐标放入渲染流水线,完成物体移动.该算法能保证移动的速度与精度,同时也可减少因移动所需的输入设备.实际应用证实该方法切实可行.

参考文献:

[1]韩晓玲. 虚拟现实技术发展趋向浅析[J]. 多媒体技术及其应用, 2005, 12(2): 549-550.

[2]陈定方, 罗亚波. 虚拟设计[M]. 北京: 机械工业出版社. 2007: 2-3.

[3]TANI B S, NOBREGA T, dos SANTOS T R. Generic visualization and manipulation framework for three-dimensional medical environments[C]// 19th IEEE Int Symp on Comput-Based Med Systems, USA: IEEE COMPUT Soc, 2006: 27-31.

[4]何健鹰, 徐强华, 游佳. 基于OpenGL的一种三维拾取方法[J]. 计算机工程与科学, 2006(1): 45-46.

[5]陆国栋, 许鹏, 温星. 基于向量夹角的三维网格模型简化算法[J]. 工程设计学报, 2005, 12(2): 124-128.

[6]王德才, 杨关胜, 孙玉萍. DirectX 3D 图形与动画程序设计[M]. 北京: 人民邮电出版社, 2007: 85-103.

[7]李怀健, 陈星铭. 基于VB获取鼠标按下点的造型空间坐标[J]. 计算机辅助工程, 2008, 17(2): 50-53.

[8]叶至军. 3D游戏开发引导[M].北京: 人民邮电出版社, 2006: 112-113.

[9]金禾工作室. 3D游戏程序设计基础[M]. 北京: 北京希望电子出版社, 2006: 122-126.

[10]LIU Z, SHI J Y, PENG H Y.A Direct3D-based large-scale display parallel rendering system architecture for clusters[C]// Advances in Comput Systems Architecture, German: Springer-Verlag, 2005: 24-26.

[11]王德才, 杨关胜, 孙玉萍. DirectX 3D 图形与动画程序设计[M]. 北京: 人民邮电出版社, 2007: 590-591.