游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2744|回复: 5

3D和2D混合使用的问题

[复制链接]

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
发表于 2005-10-3 15:02:00 | 显示全部楼层 |阅读模式
    一个3D和2D混合使用的场景,背景是一张bmp图,bmp图与整个游戏窗口一样大,在bmp上已经画好了障碍物。
    3D用在人物显示上,并且要和背景的障碍物做碰撞检测,但因为3D渲染后会有变形,和2D的做法是不同的,所以我想把3D渲染完成后的图形看作一个矩形,然后和障碍物矩形做碰撞检测。
    问题出来了,怎么才能使这个检测尽量精确,因为在3D世界移动1个单位,在屏幕上并不是移动一个像素,也就是怎样让这个模拟最大程度的精确,请高手赐教,如有题目描述有任何问题不明白,可以加QQ:78939328,谢谢。

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-10-4 10:27:00 | 显示全部楼层

Re:3D和2D混合使用的问题

3d渲染不一定变形的,设定成正交投影矩阵就没透视感了。
你把你的世界坐标系定的简单点,再写个屏幕坐标到世界坐标系坐标的转换函数不就行了?

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2005-10-4 11:42:00 | 显示全部楼层

Re:3D和2D混合使用的问题

你应该研究一下《生化危机1》和《生化危机2》,他们就是2D和3D结合的最好游戏案例。

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
 楼主| 发表于 2005-10-4 12:10:00 | 显示全部楼层

Re: Re:3D和2D混合使用的问题

lights: Re:3D和2D混合使用的问题

3d渲染不一定变形的,设定成正交投影矩阵就没透视感了。
你把你的世界坐标系定的简单点,再写个屏幕坐标到世界坐标系坐标的转换函数不就行了?


    不是很明白阿,比如说我现在要使3D不变形,我能想到的就是摄像机的x,y和原始3D物体的坐标垂直,因为是应用于2D,所以Z轴是没用的,这样确实能做到不变形渲染。
    但是你说的那个屏幕坐标到世界坐标系坐标的转换函数我不知道如何入手,请指教,再次感谢。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2005-10-5 15:05:00 | 显示全部楼层

Re:3D和2D混合使用的问题

“因为在3D世界移动1个单位,在屏幕上并不是移动一个像素”
很显然,楼主用的环境系统是2D环境。
环境,应该用3D的吧?

我想,“生化危机2”的整个环境,应该是3D的。
惟独只有背景图案是2D。
就是说,人物移动的“地面形状”都应该用3D的。

先设计好3D的环境,如“房间里的地面形状”和“障碍物”,
最后再把BMP背景加上去。
如果这个BMP跟3D环境不一致,那就只好去修改“摄象机的坐标,视角等”了。

3D程序:
房间地面大小是400X400。中间有一个40X40的障碍物,摄象机坐标是(0.0,10.0,200)
碰撞判定:
如果“人物X坐标绝对值<20”且“人物Y坐标绝对值<20”,则判定为“碰撞”。
如果“碰撞”了,做以下处理:
{如果“人物X坐标>0”,则“人物X坐标=20”,不然“人物X坐标=-20”
如果“人物Y坐标>0”,则“人物Y坐标=20”,不然“人物Y坐标=-20”}

渲染程序:
如果“人物Y坐标>20”,则①渲染整个BMP背景②渲染BMP里的障碍物③渲染人物
(因为这时Y>20,说明“人物遮盖障碍物”)或直接①③就OK了。
如果“人物Y坐标<20”,则①渲染整个BMP北京②渲染人物③渲染BMP里的障碍物
(因为人物Y坐标<20,说明“障碍物遮盖人物”)

楼主,你觉得呢?

7

主题

41

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2005-10-9 10:00:00 | 显示全部楼层

Re:3D和2D混合使用的问题

引用卡马克老大的一句话:
To know it cold , have a deep understanding of the foundamentals.

为了简化问题,假设摄像机坐标位置世界坐标的原点,视野方向指向Z轴正方向,这样摄像机矩阵就是单位阵,也就是说某点的世界坐标就是摄像机坐标。

设人物的中心点为Pc( x, y, z ),人物被一个半径为R的边界球所包围。并且设人物最后被投影到的2D平面(也就是绘制2D背景的平面)的距离为d.那可以通过计算得到d.  d= 0.5Width/tg(alpha/2), 其中Width为屏幕的宽,alpha为摄像机的视角。 现在可以计算人物中心点被投影到2D平面的位置,x/z = Xp/d 其中Xp就是投影后的位置, Xp = x/z*d, 由于此时的Xp范围为[-0.5Width, 0.5Width],因此需要继续变换,使得Xp的范围为[0, Width],只要在Xp上加上一个0.5Width就行了,而对于Yp是类似的, 不同的是Y轴的正方向是向下的,因此,需要用0.5Hieght -Yp.
最终得到的投影坐标

Xp = x/z*d + 0.5Width;
Yp = 0.5Hieght - y/z*d *ar; // ar = hieght/width(因为投影平面不是正方形)

最后,将R投影到2D平面,很简单 r/d = R/z,r = R/z*d;

最终得到了一个中心点在Xp,Yp,半径为r的边界圆,这时要判断碰撞就很容易了。

对于一般位置的摄像机,只要将人物的中心点变换成摄像机坐标就行了。方法是乘上一个摄像机矩阵。

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

本版积分规则

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

GMT+8, 2025-12-28 01:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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