从三维坐标到二维坐标的转换

wjzhwht 2007-08-16 03:18:04
如何将一个长方体在三维坐标系中的坐标投影到一个二维坐标系中,然后根据投影得到的点绘制出该长方体
也就是说如何才能在VC中画出一个长方体。
...全文
3997 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
syz 2009-12-20
  • 打赏
  • 举报
回复
to HW121:
directX sdk文档上写的VIEW MATRIX转换,右手视图坐标生成,
用的怎麽是
struct Vector { int x, y, z };

struct Matrix { int a11,a12,a13; int a21,a22,a23; int a31,a32,a33; };
V = V '* M
V.x = v '.x*M.a11 + v '.x*M.a12 + V '.x*M.a13;
V.y = v '.y*M.a21 + v '.y*M.a22 + V '.y*M.a23;
V.z = v '.z*M.a31 + v '.z*M.a32 + V '.z*M.a33;
wjzhwht 2007-08-20
  • 打赏
  • 举报
回复
//将3D坐标转换为2D坐标
//这个好象是叫做斜等测平行投影
void Transform3DTo2D(f2dPoint *pt2d, const f3dPoint *pt3d, const int &n)
{
for(int i=0;i<n;i++)
{
pt2d[i].x=pt3d[i].x - pt3d[i].z /sqrt(2);
pt2d[i].y=pt3d[i].y - pt3d[i].z /sqrt(2);
}
}
//用于坐标旋转变化的矩阵,只要给这个矩阵赋值就可以做相应的变换
dPoint * TranslatePoint(f3dPoint *pt, double matrix[][4], const int &n)
{
for(int i=0;i<n;i++)
{
double a[4] = {pt[i].x,pt[i].y,pt[i].z,1};
pt[i].x = a[0]*matrix[0][0]+a[1]*matrix[1][0]+a[2]*matrix[2][0]+a[3]*matrix[3][0];
pt[i].y = a[0]*matrix[0][1]+a[1]*matrix[1][1]+a[2]*matrix[2][1]+a[3]*matrix[3][1];
pt[i].z = a[0]*matrix[0][2]+a[1]*matrix[1][2]+a[2]*matrix[2][2]+a[3]*matrix[3][2];
}
return pt;
}

//平移
ClearMatrix(); //清空矩阵
matrix[0][0]=1;
matrix[1][1]=1;
matrix[2][2]=1;
matrix[3][3]=1;
matrix[3][1]=10;//X轴正方向移动10个单位
//错切
ClearMatrix();
matrix[0][0]=1;
matrix[1][1]=1;
matrix[2][2]=1;
matrix[3][3]=1;
matrix[1][0]=0.5;
matrix[2][0]=2;
//旋转 绕Z轴旋转 每次转30度
ClearMatrix();
matrix[0][0]=cos(30*Pi/180);
matrix[0][1]=sin(30*Pi/180);
matrix[1][0]=-sin(30*Pi/180);
matrix[1][1]=cos(30*Pi/180);
matrix[2][2]=1;
matrix[3][3]=1;
//反射
ClearMatrix();
matrix[0][0]=-1;
matrix[1][1]=1;
matrix[2][2]=1;
matrix[3][3]=1;
//按比例变换
ClearMatrix();
matrix[0][0]=0.8;
matrix[1][1]=0.6;
matrix[2][2]=0.5;
matrix[3][3]=1;

3D坐标转换为2D坐标大概应该以上的步骤
还有一些基本的变换操作
gfxiang 2007-08-18
  • 打赏
  • 举报
回复
对3维坐标变换应该用4*4的矩阵,这样可以把平移、旋转、缩放等操作都用4*4的矩阵表示。
相应的坐标向量就加一个量w,即X = [x y z w]^T,w=1
平移操作
[1 0 0 Tx]
[0 1 0 Ty] = T
[0 0 1 Tz]
[0 0 0 1]
上面的矩阵T左乘坐标向量X就得平移后的向量X',X' = T X
绕x轴旋转
[1 0 0 0]
[0 cos t -sin t 0] = Rx
[0 sin t cos t 0]
[0 0 0 1]
绕y轴旋转
[cos t 0 sin t 0]
[0 1 0 0] = Ry
[-sin t 0 cos t 0]
[0 0 0 1]
绕z轴旋转
[cos t -sin t 0 0]
[sin t cos t 0 0] = Rz
[0 0 1 0]
[0 0 0 1]

然后就根据操作顺序,把矩阵依次相乘就得变化后的坐标。
比如先沿x轴平移10个单位,再绕x轴旋转30,再绕y轴选择-30度,那变换就是
Ry * Rx * T * X
其中矩阵中Tx = 10,Rx中的t=30,Ry中的t=-30
ybtianyu 2007-08-17
  • 打赏
  • 举报
回复
3 * 3的矩阵叫做旋转矩阵,与物体绕x,y,z轴旋转的角度有关.坐标系的变换除了旋转矩阵外,还有一个平移向量.但我始终还是没有模拟出来,物体的若干点转换到新坐标系下的坐标始终不对.待高人指点
HW121 2007-08-17
  • 打赏
  • 举报
回复
上面有误,数据类型应该为double。
struct Vector { dublle x, y, z };
struct Matrix { double cxx,cxy,cxz; double cyx,cyy,cyz; double czx,czy,czz; };
可以定义为class和各自的操作(如+-*等)及函数
其中Matrix中cij物理意义为原坐标j轴上的单位向量在新坐标轴i的投影(前提是正交坐标系)
对你来讲知需要知道观察坐标位置得出矩阵中系数(可由物理意义或旋转得出),有矩阵再将顶点换算成观察坐标,再到屏幕坐标(屏幕坐标y向下)可画出边线,视线最远(z值最大)顶点所连成线可判断是否要隐藏。
HW121 2007-08-16
  • 打赏
  • 举报
回复
struct Vector { int x, y, z };
struct Matrix { int a11,a12,a13; int a21,a22,a23; int a31,a32,a33; };
V = V'* M
V.x = v'.x*M.a11 + v'.y*M.a12 + V'.z*M.a13;
V.y = v'.x*M.a21 + v'.y*M.a22 + V'.z*M.a23;
V.z = v'.x*M.a31 + v'.y*M.a32 + V'.z*M.a33;
V'为原坐标, V为观察坐标
如果要自己写,一定要自己把要把坐标旋转公式推导一遍,三维坐标绕各轴的旋转角度后旋转算子矩阵,还有绕某个矢量的旋转的旋转算子矩阵。旋转就是乘算子矩阵,就可得出新的观察坐标位置。
wjzhwht 2007-08-16
  • 打赏
  • 举报
回复
for(int i=0;i<n;i++)
{
pt2d[i].x=pt3d[i].x - pt3d[i].z /sqrt(2);
pt2d[i].y=pt3d[i].y - pt3d[i].z /sqrt(2);
}
这样是不是可以把3维的点转化为2维的点?
这个转化有什么根据吗?谁知道?
gfxiang 2007-08-16
  • 打赏
  • 举报
回复
楼主用OpenGL最方便啦,这些坐标转换OpengGL会自动转换
wjzhwht 2007-08-16
  • 打赏
  • 举报
回复
矩阵A是哪个矩阵,是 uvw这个吗?是不是转换后就可以只用xy 表示一个点的位置?z值判断点的位置前后是什么意思?
你能不能举个例子说下,麻烦你拿个具体的点转换下看看,谢谢~
HW121 2007-08-16
  • 打赏
  • 举报
回复
空间变换,简单的

[ x ] [ a11 a12 a13 ] [ u ]
[ y ] = [ a21 a22 a23 ] [ v ]
[ z ] [ a31 a32 a33 ] [ w ]
x = a11*u + a12*v + a13*w
y = a21*u + a22*v + a23*w
z = a31*u + a32*v + a33*w
将长方体的8个顶点按公式转换为新坐标,x,y值投影位置,z值为判断点的前后
其中 矩阵A为转换矩阵
wjzhwht 2007-08-16
  • 打赏
  • 举报
回复
就是简单的就可以了...
麻烦,能不能举个例子说下哈?
比如说给出一个长方体的8个顶点
vertex1(1,1,1)vertex2(1,0,1)vertex3(1,1,0)vertex4(0,1,1)
vertex5(0,0,0)vertex6(0,1,0)vertex7(0,0,1)vertex8(1,0,0)
如何将这些点的坐标转换为2维坐标,然后用这些2维坐标画出这
个长方体?
冷月清晖 2007-08-16
  • 打赏
  • 举报
回复
线框图形,用win32 GDI就可以实现,如果想要高级的,就有点难度。但你可以用Opengl或Direct实现。
wjzhwht 2007-08-16
  • 打赏
  • 举报
回复
怎么没人回贴啊。。。

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧