请教一个问题

regularliu 2003-08-30 01:56:20
我需要把鼠标的坐标转化为用户的三维坐标中去
但是我根据透视投影的原理得到的结果老有问题
请问右高手做过这方面的事情吗??
谢谢!
...全文
23 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
regularliu 2003-08-30
  • 打赏
  • 举报
回复
我还不知道怎么做
算了
先休息半小时
regularliu 2003-08-30
  • 打赏
  • 举报
回复
虽然问题还没有搞定
不过我还没有搞定
寻开心 2003-08-30
  • 打赏
  • 举报
回复
你看看3dmax等建模软件,你就会发现他们最初始的时候都是假定有一个平面的,把物体都从这个平面开始创建,先绘制这个平面上的平面图像,然后再在它的垂直方向上长起来。

在你确定了鼠标点只能确定一个射线这个事实后,再看这些造型软件的使用方式,就会很好的理解他们为什么那么操作,是为了方便,也是因为别无选择。
寻开心 2003-08-30
  • 打赏
  • 举报
回复
你的理解没有错,前面给你的变换公式只是确定了鼠标对应的屏幕点和你的投影平面之间的关系,鼠标点对应的绝对不是一个点,而是一条线,从相机位置到投影平面点这个方向上的一个射线。

你需要根据这个射线自己来确定和什么空间平面去交,从而决定点在那里。

你可以这样理解,用一只眼睛看东西,分不出远近,你看到的一个点其实就是一条线。
寻开心 2003-08-30
  • 打赏
  • 举报
回复
根据显示原理,视平面矩形xstart, ystart, xend, yend 当中的内容线性变换关系对应于屏幕上的窗口矩形 xs,ys,xe,ye。
对于一个程序来说,通常把一个完整的窗口给予三维显示,那么xs=ys=0,
在这个时候,需要用API函数把鼠标的屏幕坐标转换到这个窗口的窗口坐标,然后再使用前面的反向变换公式就可以了。
regularliu 2003-08-30
  • 打赏
  • 举报
回复
那画出来的都是在一个平面上的
成不了立体的物体阿
我的理解有错吗??
寻开心 2003-08-30
  • 打赏
  • 举报
回复
视平面的矩形是你自己定义出来的,那么投影点到屏幕的变换就是这样的
假定你定义的视平面的矩形视: XSTART, YSTART, XEND, YEND, 对应于屏幕的窗口坐标是:
xs,ys,xe, ye
那么从视平面点x y到 窗口点x' y'的变换关系就是
(x-xstart)/(xend-xstart) = (x'-xs)/(xe-xs)
(y-ystart)/(yend-ystart) = (y'-ys)/(ye-ys)
x' = (xe-xs)*(x-xstart)/(xend-xstart) + xs
y' = (ye-ys)*(y-ystart)/(yend-ystart) + ys
反向变换
x = (x'-xs) * (xend-xstart) / (xe-xs) + xstart;
y = (y'-ys) * (yend-ystart) / (ye-ys) + ystart;
z = 1500

regularliu 2003-08-30
  • 打赏
  • 举报
回复
透视变换的矩阵为
[{1,0,0,0},
{0,1,0,0},
{0,0,1,1/D},
{0,0,0,0}
]
D为视平面的Z坐标
该矩阵变不回去啊
怎么办?

对角点(-350,-350)(350,350),确定区域以后再做三维裁剪
寻开心 2003-08-30
  • 打赏
  • 举报
回复
视平面的两个对角点是多少呢?
这种方式下,视点是固定的吧,否则视点的移动可和实际的情况不符合了。
如果给出视平面上可视区域的大小是可以确定这个唯一的转换关系的。

你的3D到2d是如何计算的?
把这个过程反过来算就对啦。

在3D到2D的计算过程当中,得到的2D的z数值应该是1500吧
把你的鼠标点的x和y取出,把z设置成为1500,然后反算就是。

regularliu 2003-08-30
  • 打赏
  • 举报
回复
我设置了视平面的两个对角点用以确定其显示区域大小
如果我自己输入体素参数
显示出来没有问题
就是说从3DPoint to 2Dpoint是没有问题的
但是
如果我捕获鼠标的坐标来生成3Dpoint出来以后情况就不对了
我想应该是从2d到3d的变换出了问题

这个2d怎么到3d,我想得有点糊里糊涂的

有关几个矩阵,我想应该没有太大问题,因为从3d到2d也要用到这些东西
我现在就是想不清楚2d到3d 的关系

我这个程序完全是用VC写的
不能调用任何有关opengl和d3d的程序
寻开心 2003-08-30
  • 打赏
  • 举报
回复
换句话说,给定视点只是确定了你向那个方向看,没有确定可以看的范围有多大。
而屏幕显示的内容多少是由这个范围控制的。
比如可看范围是90度和60度的时候,屏幕上显示同一个物体的位置就会有差异,就好比你只是摆放了相机,但是没有装镜头,是广角的还是小角度的是要有参数来指定的。
寻开心 2003-08-30
  • 打赏
  • 举报
回复
你是说你的三维场景没有利用opengl或者是D3D,而是完全自己做的?
无论你是否采用了上面的那两个东西,基本原理都应该是一样的。
有三个变换矩阵,世界矩阵,相机矩阵和投影矩阵
世界矩阵用来摆放物体在世界坐标系下的位置,我们不管它。
相机矩阵,把物体变换倒相机坐标系,这个坐标系的Z坐标轴就是照相机的朝向,Y和X轴是你来确定的。
而透视投影矩阵是把物体从相机空间变换到屏幕空间,坐标范围就是窗口的范围。
关键是你的相机矩阵和投影矩阵如何做的,前面给的两个反算方法都是利用了设置相机矩阵和投影矩阵的参数来做的,如果你有这两个矩阵,把他们的逆矩阵计算出来,反向变换就得到了世界坐标系的位置。第二种办法也是一样,只不过不用计算逆矩阵,变通的做法。

只知道视点的参数是不够的,还要知道如何的到显示器窗口的投影
regularliu 2003-08-30
  • 打赏
  • 举报
回复
我是透视投影到视平面来做的
先将视点平移到坐标原点
然后旋转,最后做透视
寻开心 2003-08-30
  • 打赏
  • 举报
回复
这个东西是和你的三维显示方式有关的。
你的三维显示是用什么做的呢?
regularliu 2003-08-30
  • 打赏
  • 举报
回复
我的视点设置在(1500,1500,1500)
视平面在Z=0处
视平面法向为(0,0,-1)
视图上方矢量为(0,1,-1)
regularliu 2003-08-30
  • 打赏
  • 举报
回复
我不得不用C++完全实现
我的目标是用鼠标画出一个三维的物体

能帮我详细解释一下吗??
非常谢谢你
寻开心 2003-08-30
  • 打赏
  • 举报
回复
两个办法
一个是利用opengl或者是directx提供的函数,把鼠标的屏幕坐标作为xy数值,z分量用1,反算对应的世界空间坐标点,然后和相机坐标一起形成了一个射线,用它选择物体。

另外一个办法是利用FOV角,窗口中心和视方向的夹角是0,距离中心点最远的宽和高方向对应的是FOV角的大小,根据鼠标点距离中心点的大小,利用tan关系反算出和视线的夹角,通过角度的关系确定这个射线。

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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