游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10607|回复: 10

求世界坐标转屏幕坐标的方法

[复制链接]

12

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2007-9-15 10:41:00 | 显示全部楼层 |阅读模式
我在Ogre网站上找到的方法,文字显示的位置不精确
而darkangel01写的[心得]从世界坐标到屏幕坐标,计算出来根本不正确,求各位达人,把世界坐标转屏幕坐标的方法告诉我,谢啦。

下面是darkangle01写的方法

取得一个三维坐标投影在屏幕(视口)上的二维坐标的方法:

将要变换变换的坐标Vector3 v3;转换成Vector4 v4(v3);

取得使用者的摄影机的视角变换矩阵和投影变换矩阵
Camera* cam=mSceneMgr->getCamera(&quotlayerCam");
Matrix4 viewMatrix=cam->getViewMatrix();
Matrix4 projectMatrix=cam->getProjectionMatrix();

将转换坐标左乘矩阵的积
Vector4 temp=viewMatrix*projectMatrix*v4;
然后齐次化
Vector3 ScreenPos=Vector3(v4.x/v4.w,v4.y/v4.w,v4.z/v4.w);

这里得到的x,y坐标的范围是(-1,+1)转换成(0,1)的范围。
float x=ScreenPos.x/2+0.5
float y=-ScreenPos.y/2+0.5


1. Vector4 temp=viewMatrix*projectMatrix*v4;而下面Vector3 ScreenPos=Vector3(v4.x/v4.w,v4.y/v4.w,v4.z/v4.w);并没能使用到temp
2. 我换成temp来进行齐次化后,还是不正确。

2

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2007-9-15 15:33:00 | 显示全部楼层

Re:求世界坐标转屏幕坐标的方法

在Ogre?站上找到的方法,文字?示的位置不精??
????法本身也很不精? XD


很明?是???了 上面???是????的?
正????
Vector4 temp = (projectMatrix*viewMatrix)*v4;
Vector3 ScreenPos = Vector3(temp.x/temp.w,temp.y/temp.w,temp.z/temp.w);
(以上?]上?C?y? 不????不??e)

而且 上面的算法是不佳的
float x=ScreenPos.x/2+0.5
float y=-ScreenPos.y/2+0.5
?2行???先合?愕?rojectMatrix 就可以省下2次除法2次加法
???ψ龃罅坑?算?r可以增加效率
以??算法?碚f 用到了sse可以快6倍

[em20]

55

主题

331

帖子

337

积分

中级会员

Rank: 3Rank: 3

积分
337
发表于 2007-9-15 21:00:00 | 显示全部楼层

Re: 求世界坐标转屏幕坐标的方法


  1. bool OgreProject(    double objx, double objy, double objz,
  2.                      const Matrix4& viewMat,
  3.                      const Matrix4& projMat,
  4.                      const RenderWindow* rm,
  5.                      double* winx, double* winy, double* winz)
  6. {
  7.         Matrix4 viewMatrix = viewMat;
  8.         Matrix4 projMatrix = projMat;

  9.         Vector4 in = Vector4(objx, objy, objz, 1.0);
  10.         Vector4 out;

  11.         out = viewMatrix * in;
  12.         in = projMatrix * out;

  13.         if(in.w == 0.0) return false;

  14.         in.x /= in.w;
  15.         in.y /= in.w;
  16.         in.z /= in.w;

  17.         // Map x, y and z to range 0-1
  18.         in.x = in.x * 0.5 + 0.5;
  19.         in.y = in.y * 0.5 + 0.5;
  20.         in.z = in.z * 0.5 + 0.5;

  21.         // Map x,y to viewport
  22.         in.x = in.x * rm->getWidth();
  23.         in.y = (1 - in.y) * rm->getHeight();

  24.         *winx = in.x;
  25.         *winy = in.y;
  26.         *winz = in.z;

  27.         return true;
  28. }
复制代码



good luck to u  @_@



4

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2007-9-16 11:08:00 | 显示全部楼层

Re: Re:求世界坐标转屏幕坐标的方法

123776: Re:求世界坐标转屏幕坐标的方法

在Ogre?站上找到的方法,文字?示的位置不精??
????法本身也很不精? XD


很明?是???了 上面??..


是不小心写错了。。。

那两行怎么合并到矩阵里?

2

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2007-9-16 13:15:00 | 显示全部楼层

Re: Re: Re:求世界坐标转屏幕坐标的方法

darkangel01: Re: Re:求世界坐标转屏幕坐标的方法



是不小心写错了。。。

那两行怎么合并到矩阵里?



                Matrix4 viewMatrix = mCamera->getViewMatrix();
                Matrix4 projectMatrix = mCamera->getProjectionMatrix();
                Matrix4 eyeMatrix = (Matrix4(0.5,0,0,0.5, 0,-0.5,0,0.5, 0,0,1,0, 0,0,0,1)*(projectMatrix*viewMatrix));
                Vector4 temp = eyeMatrix*v4;
                Vector3 ScreenPos = Vector3(temp.x/temp.w,temp.y/temp.w,temp.z/temp.w);

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-9-16 15:12:00 | 显示全部楼层

Re: Re: Re: Re:求世界坐标转屏幕坐标的方法

123776: Re: Re: Re:求世界坐标转屏幕坐标的方法

Matrix4 viewMatrix = mCamera->getViewMatrix();
Matrix4 projectMatrix = mCamera->getProjectionMatrix();
Matrix4 eyeMatrix = (Matrix4(0.5,0,0,0.5, 0,-0.5,0,0.5, 0,0,1,0, 0,0,0,1)*(projectMatrix*viewMatrix));
Vector4 temp = eyeMatrix*v4;
Vector3 ScreenPos = Vector3(temp.x/temp.w,temp.y/temp.w,temp.z/temp.w);


哪里省了?

2

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2007-9-16 15:56:00 | 显示全部楼层

Re: Re: Re: Re: Re:求世界坐标转屏幕坐标的方法

Enigmaya: Re: Re: Re: Re:求世界坐标转屏幕坐标的方法



哪里省了?


在我第1篇的回文?了 大量的??Q!!
MATRIX只要求出一次

4

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2007-9-17 09:09:00 | 显示全部楼层

Re:求世界坐标转屏幕坐标的方法

不过一般情况下每次矩阵都不同的。

42

主题

137

帖子

137

积分

注册会员

Rank: 2

积分
137
发表于 2007-9-18 11:00:00 | 显示全部楼层

Re:求世界坐标转屏幕坐标的方法

太感谢123776了!!

6

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2007-11-9 19:42:00 | 显示全部楼层

Re: 求世界坐标转屏幕坐标的方法

那篇《心得》我也看过,放到工程中一用,根本不是那么回事!

可是咱又不会闹矩阵,最后实在没办法,只好自己一点点算出来了!

我的方法://别笑啊,我自己知道很笨!只是我相信不会线性代数的不光我一个。

1。获得“视线”失量方向,就叫 vecView 吧。
(camera->getRayToViewport().getDirection()(函数名记不太清))。

2。获得摄像机与近视截面的距离,结合上面的“方向”就知道屏幕中心点在“3D”中的位置了。

3。获得目标3D坐标,结点摄像机位置,得到从摄像机到目标点的方向失量。
(Vector3 vecTarget = posTarget - posCamera).

4.计算在上面这个方向从摄像机开始往前、距离为摄像机近视距的点的 3D 坐标,假设这点为 PT,前面算到的屏幕中心 3D 点为 PV。

5。取 PT 与 PV 的平均值,其是这两点的“中心对称”点,借助这个中心点得到 vecView 与 vecTarget 之间的角度.  再由角度结合摄像机与近视截面距离就得到要求 2D 点与屏幕中心点的距离,不过摄像机有一个可视角度问题,还要转化一下。

6。上面只是得到一个距离,然后要判断摄像的方向与朝向,特别是摄像机是“仰视”还是“俯视”,将两个点在 Vector3.Y 上的差转换成屏幕中心点与要得到的点在屏幕坐标竖直方向上的差,屏幕中心是已知的,所以目标点在屏幕上的 Y 坐标就知道了。

7。计算 X 坐标就麻烦了, 由直角三角形的性质去得目标点与屏幕中心的水平方向距离。关键是判断这个点到底是在屏幕中心点的“左”边还是“右”边,我的方法是把 vecView、vecTarget 都投射到水平面上,然后求它们的“叉乘”,根据结果失量的 Y 的正负来判断是“左”还是“右”。
===============================================

刚才在网上看到这样的一段文字:
“夜 日本:妹:哥,你比爸爸厉害多了 哥:妈妈也这么说”。

我觉得改成这样更好一点:
“夜。
日本。
妹:哥,你比爸爸厉害多了!
哥:妈妈也这么说!


==============================
随便说的,别骂我!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-11-22 13:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表