您的位置:首页 > 其它

三维坐标向任意平面的正平行投影

2013-05-08 16:18 1686 查看
简化三维坐标系向任意平面的正平行投影的计算过程,得出一个比较容易计算的投影坐标公式。不用计算角度和坐标变换,方便易用。当然,OPEN GL或directX可不必这么麻烦。

设三维本地空间坐标系,原点O。内有一投影平面,其平面内二维坐标系,即二维投影坐标系,原点o。三维坐标系内任一点该平面的正平行投影,有:

1)与过三维坐标系原点且平行于投影平面的平面投影相同。

2)假设视线方向向着原点。即视线方向与投影面垂直,交点是三维坐标系原点。

所需要的参数是用以确定投影平面的三维坐标系中的二个点:

1)二维坐标系的原点V(vx0, vy0, vz0)。下面按OV垂直于投影平面。若二维坐标系原点不是V,那么最终的计算结果根据V点在二维坐标,在二维坐标系内有个平移。OV垂直于投影平面,V点确定后,投影平面已经确定。

2)任选一旋转点W(wx0, wy0, wz0)。用以确定投影平面内的二维坐标系旋转角度。W点是任意的,但不能在r=rOV所确定的直线上。设OV^VW是二维坐标系y轴反方向。一般选择VW垂直于OV,此时VW即是二维坐标系x轴方向。

也就是说,在三维坐标系内,需要事先得到过原点垂直于投影平面垂线的矢量,及投影平面内过垂点平行于投影二维坐标系x轴的直线上某点的矢量,即可完成任意平面的投影。如果不关心二维坐标旋转角度,那么W点是任取的。

注:能确定投影平面和其内部二维坐标系的其他参数也可以,但不如用向量方便,不用计算角度和坐标变换。

基于向量,计算出三个单位向量:

1)iOV = OV/|OV|; // OV表示原点向V点的向量

2)ih = iVW[b]^[/b]iOV; // 叉乘。得到投影二维坐标y轴方向

3)iv = iOV[b]^ih[/b];

三维坐标系任一点P(x0,y0,z0)至过V点垂直于OV的平面的投影坐标公式:

x = iv*OP; 点乘

y = ih*OP;

z = iOV*OP;// Z-order,可以用于消隐和剪裁,距离观察者越近值越大

将投影坐标系显示在屏幕窗口,屏幕坐标为:

x1 = ox1 + x = ox1 + iv*OP;

y1 = oy1 - y = oy1 - ih*OP;

(ox1,oy1)是二维投影坐标系原点的屏幕坐标(窗口坐标)。需要注意的是坐标比例选取和浮点与整型之间的转换。

平移和缩放建议:可以平移投影平面原点在三维坐标系中的坐标值,也可以平移其屏幕坐标ox1,oy1(比较方便),缩放类同。

就可以将任意立体物体投影在显示屏幕。比如一个二元函数z=f(x,y)的曲面。但还需要处理遮挡等问题。

简化三维坐标二维平面的投影计算,适合于任意方向任意平面的正平行投影,不必计算坐标旋转角度,精度也高,缩放平移旋转都很方便。也可以扩展到向任意平面的中心投影(按距离比例缩放)。



三维向量类,可以参考使用:

#include <math.h>

class cv3 {

public:

double x;

double y;

double z;

const cv3 operator +(const cv3 &CP){class cv3 t(*this);t.x+=CP.x;t.y+=CP.y;t.z+=CP.z;return t;}

const cv3 operator -(const cv3 &CP){class cv3 t(*this);t.x-=CP.x;t.y-=CP.y;t.z-=CP.z;return t;}

const cv3 operator ^(const cv3 &CP){class cv3 t(*this);t.x=y*CP.z-z*CP.y;t.y=z*CP.x-x*CP.z;t.z=x*CP.y-y*CP.x;return t;}

const double operator *(const cv3 &CP){return x*CP.x+y*CP.y+z*CP.z;}

const cv3 operator *(const double &k){class cv3 t(*this);t.x*=k;t.y*=k;t.z*=k;return t;}

const cv3& operator =(const cv3 &CP){x=CP.x;y=CP.y;z=CP.z;return *this;}

const bool operator==(const cv3 &CP){return x==CP.x&&y==CP.y&&z==CP.z;}

double m(){return sqrt(x*x+y*y+z*z);}

cv3(){x=0;y=0;z=0;}

cv3(double a1,double a2,double a3){x=a1;y=a2;z=a3;}

cv3(class cv3& CP){x=CP.x;y=CP.y;z=CP.z;}

// ~cv3(){};

} ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐