【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 6587|回复: 21

[求助]3D模型在屏幕中的位置(三年前的疑惑,一定要解决掉~~~)

[复制链接]
发表于 2008-12-9 15:42:01 | 显示全部楼层 |阅读模式

我学会了把一个3D模型显示在我的窗口中,我学会了如何缩放它,如何旋转它,但。。。。

到今天我都不知道,怎么才能把它放到我想放的位置???

三维坐标(X,Y,Z)如何与屏幕的二维坐标(X,Y)对应???

比如,我的游戏界面是800*600的,现在,我想放置一个3D模型在一个RECT中,

假设这个RECT:

rect->top=0

rect->left=0

rect->right=200

rect->bottom=100

这个问题,三年前我在很多知名的编程论坛和游戏论坛都问过,不过没有人能很好的解释,好像都不明白我的意思。。。。

我这时候在网上随便找了个图,PS了一下,还不懂我的意思的话,我就去高中补习语文。。。。

图在这里:

[此贴子已经被作者于2008-12-9 21:39:39编辑过]
 楼主| 发表于 2008-12-19 21:54:05 | 显示全部楼层

鼹鼠啊,我查了一下SDK,Present是这样的:

 

HRESULT Present(
  CONST RECT * pSourceRect,
  CONST RECT * pDestRect,
  HWND hDestWindowOverride,
  CONST RGNDATA * pDirtyRegion
);

 

它就是把 BackBuffer 的某一个 矩形区域(pSourceRect)显示到指定的窗口(hDestWindowOverride)中的矩形区域(pDestRect

是这样的吧??

 

简单说就是:把 BackBuffer 的一个矩形区域 COPY 到 一个指定窗口的矩形区域

但现在的问题是:屏幕上的矩形区域可以由我来随意指定,但,我却不能把 MESH 投影到这个矩形中,因为我无法计算出 MESH 为了投影到这个矩形中,在空间坐标中的具体坐标。。。。

 

我去看了一下微软 DX SDK 的例子,里面有一个 PICK 代码很简单,它里面用一个函数完成了:从屏幕上一个点(X,Y),得到一条“射线”,现在就差:在这条射线上来找到一个点,然后把 MESH 放到那里去,能让这个 MESH 正确地投影到我在屏幕上指定的区域,我正在想办法。。。 

 楼主| 发表于 2008-12-19 22:06:32 | 显示全部楼层
对了,我突然想到,我现在要做的工作貌似和渲染管道的工作流程完全相反,感觉自己好像在逆天而为。。。。。
 楼主| 发表于 2008-12-19 22:09:55 | 显示全部楼层
关于移动摄像机的方法,我想还是放弃吧。它只适合显示一个 MESH 的时候,如果屏幕的构成比较复杂,需要在N个不同的区域内分别显示不同的 MESH 移动摄像机也可以吗???
 楼主| 发表于 2008-12-19 22:10:53 | 显示全部楼层
有没有相关的源代码,电子书之类的。。。搞来看看
发表于 2008-12-21 10:47:17 | 显示全部楼层

这个不是一两行代码能说清楚的

你能明白原理走向成功就是时间问题了。

发表于 2008-12-23 19:59:58 | 显示全部楼层

呵呵 ,那当然 这个当然关键啦

可以参看 “渲染到纹理”相关的内容。

发表于 2008-12-20 17:44:26 | 显示全部楼层
QUOTE:
以下是引用drucula在2008-12-19 22:09:55的发言:
关于移动摄像机的方法,我想还是放弃吧。它只适合显示一个 MESH 的时候,如果屏幕的构成比较复杂,需要在N个不同的区域内分别显示不同的 MESH 移动摄像机也可以吗???

你要表达的东西已经逐渐清晰了

 

你想实现的效果,用我最开始的办法保证能解决

 

自己实现一个控件,这个控件就是一个区域,专门用来画3D图形的。然后你写一个代码在surface内存中把这个MESH图形拷贝出来,放在你自己写的控件中显示,想画几个就生成几个控件就完了。我们原来做得商城就是用的这个原理。有很多的3D小模型,什么袜子,帽子,护腕手套。这些3D模型是不可以显示在UI上的。我们就从内存中把画好的这么模型拷贝出来,去掉背景色,再把得到的图形拷贝到我们的UI控件上。这样一个平面内就可以放置多个不同模型了。

 楼主| 发表于 2008-12-20 23:06:24 | 显示全部楼层

用控件实现貌似是最好的办法,而且用途也很广泛啊。。。。YY中~~~

你说的方法我明白,但。。要怎么实现啊,具体用哪些API??

有源代码不??不方便的话,一点关键的片段也行。。。

 

E-Mail:freddakula@yahoo.com.cn

对了,我的联系方式你知道的。。。

发表于 2009-1-4 00:50:18 | 显示全部楼层

正好 我正准备扩充UI做一些东西

这几天我尝试一下把渲染到纹理做出来看看吧~

发表于 2008-12-10 19:49:46 | 显示全部楼层

你这个问题我到是可以说一下

我现在也没有完全懂得你要实现的效果,不过仅这个图片而言,我来谈谈的,也许对你有所帮助。

 

 你所说的3D模型坐标和窗口坐标的对应关系是不存在的;很简单一个例子就可以证明:模型没有动,你移动摄像机,你的模型还会在原来的位置吗?不会了,原因是三维坐标系内的物体我们要看到,只能通过视口(摄像机)这个概念来看,它怎么能和你的坐标对应呢?

 

1.在屏幕上看到一个模型,要经过3次坐标变换 分别是世界坐标变化---视角坐标变换---投影坐标变换;经过三次这样的变换,我们就可以把一个三维模型画在窗口中了。一般的情况下,视角(可以理解为摄像机)默认的视点(就是眼睛看的焦点)是(0,0,0)点 , 也就是坐标系原点。所以一般做实验的时候模型都画在了原点上。换句话说就是一般默认创建的模型在原点上,我们看的位置也在原点,这样保证我们能看到模型。

 

2.如何去移动这个模型的位置,其实并不复杂,我们可以通过坐标变换来完成(有API函数,调用就可以了);在三维空间中移动一个模型要注意赋值,不要移到屏幕外面,就找不到了。我们能看到游戏中模型的运动,都是经过这样的变换做到的。

 

3.对于这个图片的这个效果而言,情况还不一样。这个图片上的效果比较复杂,它实现了一个三维模型画在了一个UI上面了,注意这并不是画在屏幕上了,而是画在用户界面UI上了;只要是我们能看到的三维物体都是画在屏幕上的,但并不都是画在UI上的,因为UI本身是2D的,三维物体画在二维平面上是要经过内存中转换的,需要特殊处理,你要做一个控件,这个控件是2D的它有自己的屏幕绘制坐标,这个控件的里面的内容就是画3D模型,相当于开一个新的视口,从内存中读取数据,把模型画在这个控件里。这样就可以随意定这个控件的二维坐标来确定其中3D模型的位置了

 

 

不知道说的这些对你有没有帮助。

 楼主| 发表于 2008-12-11 10:36:21 | 显示全部楼层
不如我再发一张图吧: 


当我们在D3D中绘制一个MESH模型时,要指定它的世界坐标:X,Y,Z 一个3D坐标,用来描述模型在3D世界中的位置。
现在,我要让这个模型,显示在我屏幕的某一块区域,而这个区域毫无疑问,是用2D坐标来描述的,就如同上面那个图的左上角的区域。
那么,问题来了,如何让这个模型显示在一个指定的2D区域中,并且大小合适呢???
发表于 2008-12-11 18:21:53 | 显示全部楼层

你的这个问题就是我说的,你就是想在窗口的固定位置画一个3D模型

 

你画3D模型的地方,相当于一个摄像机的视口,你可以专门做一个控件来显示这个模型,这个控件要从内存中获取3D数据,其实我们通常的看到的3D模型也是从内存中拿到数据画出来的,不同的是微软的API帮你做好了,你现在要自己画一个自己想要的,你的控件就必须手动从内存表面(内存中存放绘制数据的地方)拿到你要画的模型。

 

还有一个变通的办法,就是调整你的摄像机视点(看东西的焦点),移动视点到模型偏右下角的位置也能实现你要的效果,不过这个时候摄像机要是一个自由摄像机的话就行不通了,必须是锁定的摄像机。

 

其实我觉得你的关键还是卡在成像原理上,就是你还不知道3D世界的模型是怎么画在窗口里的,要是明白了这,你就不会有这个疑问了

 楼主| 发表于 2008-12-12 08:34:03 | 显示全部楼层

“其实我觉得你的关键还是卡在成像原理上,就是你还不知道3D世界的模型是怎么画在窗口里的,要是明白了这,你就不会有这个疑问了”。。。

昨天有人和我说一样的话。。。。

我再去找基本基础的D3D看看,你有没有什么好点的书,或者代码,来帮我解决问题的。。。推荐下

发表于 2008-12-12 12:54:07 | 显示全部楼层

建议你自己实现一个摄像机

做完一个摄像机 我想你就明白了

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 09:51

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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