一个小问题,关于顶点坐标的,却让我很困惑

nut799 2010-02-12 04:29:55
用directx 画2d图形,比如说 一个矩形 ,发现设给他的顶点 坐标 和在屏幕上显示的坐标(用屏幕坐标抓取器抓取)之间 差很多。。请问这是什么原因呢?

...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nut799 2010-02-23
  • 打赏
  • 举报
回复
回8楼 ,嗯 问这个问题的原因是这样:
我是自己封装了一个按钮类,在鼠标点击时将 鼠标的当前位置和 按钮的 矩形区域(四个顶点定义(D3DFVF_XYZRHW))进行比较 来判断是否本按钮被点击。

如果 顶点 坐标 和实际显示的坐标 会根据窗口的大小自适应的话,,判断 按钮被点击 的功能就会无效。
因为看上去鼠标是在 按钮上点了 ,实际是在 按钮的显示位置上点击,而 比较是 将鼠标的位置 和
顶点定义 的位置比较,两个位置 是不一样的。


如果我把 窗口设成 800*600,两个位置(顶点的显示位置和 实际定义位置)一致了,判断按钮是否被点击功能就可以正常工作了,

但是这样的话,我想按钮被复用,那么必须要求别的程序也把 窗口设成800*600,这样是不是很奇怪。
请问有什么解决方法吗?
nut799 2010-02-23
  • 打赏
  • 举报
回复
对 是第二种情况, 谢谢楼上
请问有backbuffer相关的资料吗 我手头上的资料对这个好像介绍不太多。呵呵
xingzhe2001 2010-02-23
  • 打赏
  • 举报
回复
鼠标点不准一般有两个原因
1.你创建窗口的时候没有减掉蓝色标题栏的高度,你可以用GetClientRect来纠正。比如你创建了一个800*600的窗口,实际上剪掉标题栏只有750*580(假设的,不是实际数据)这样,而你在createdevice时候用的backbuffer的分别率如果是800*600,就跟实际显示面积不一致了。

2.可能backbuffer和窗口的大小不一致。像你说的,并不是要求用户非要用800*600,而是用户的backbuffer和窗口大小一致。要么都是800*600,要么都是1024*768
xingzhe2001 2010-02-22
  • 打赏
  • 举报
回复
引用 6 楼 nut799 的回复:
回楼上,顶点格式是顶点 格式为D3DFVF_XYZRHW  ,说明不需要进行变换了 ,直接是进行2d绘图。
我的问题问的不好,我的问题是:
我把窗口大小设成 1024*768的时候,他的顶点 坐标 和在屏幕上显示的坐标(用屏幕坐标抓取器抓取)之间 是不一样的

设为 800*600, 就一致了。

是不是显示出来的还会根据窗口大小来自适应?

D3DFVF_XYZRHW 是像素坐标,如果你的backbuffer是800*600,而窗口是1024*768,可能就不对应了
xychzh 2010-02-21
  • 打赏
  • 举报
回复
楼主若有耐心,可以参考一下我的总结:
D3DPRIMITIVETYPE和D3DCULL_MODE以及顶点等相关总结:
http://blog.csdn.net/xychzh/archive/2010/02/05/5291877.aspx
nut799 2010-02-21
  • 打赏
  • 举报
回复
回楼上,顶点格式是顶点 格式为D3DFVF_XYZRHW ,说明不需要进行变换了 ,直接是进行2d绘图。
我的问题问的不好,我的问题是:
我把窗口大小设成 1024*768的时候,他的顶点 坐标 和在屏幕上显示的坐标(用屏幕坐标抓取器抓取)之间 是不一样的

设为 800*600, 就一致了。

是不是显示出来的还会根据窗口大小来自适应?
nut799 2010-02-13
  • 打赏
  • 举报
回复
在顶点结构体中没有RHW时,Direct3D将执行视、投影、世界等变换以及进行光线计算,之后你才能在窗口中得到你所绘制的物体。当顶点结构体中有RHW时,就像上面那段英文所述,告知Direct3D使用的顶点已经在屏幕坐标系中了,不再执行视图、投影、世界等变换和光线计算,因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理,并直接将顶点进行光栅操作,任何用SetTransform进行的转换都对其无效。不过这时的原点就在客户区的左上角了,其中x向右为正,y向下为正,而z的意义已经变为z-buffer的象素深度。
值得注意的是D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能共存,因为后两个标志与前一个矛盾。在使用这种顶点时,系统需要顶点的位置已经经过变换了,也就是说x、y必须在屏幕坐标系中,z必须是z-buffer中的象素深度,取值范围:0.0-1.0,离观察者最近的地方为0.0,观察范围内最远可见的地方为1.0。

bcstar 2010-02-13
  • 打赏
  • 举报
回复
因为 有屏幕坐标系和 世界坐标系 模型坐标系 等等。
你经过了一些坐标系之间的转换
butterflygogogo 2010-02-12
  • 打赏
  • 举报
回复
D3DFVF_XYZRHW也要经过变幻的 只不过这样的变幻不需要你完成 程序自动给你完成了
另外你的坐标是什么坐标 ?
nut799 2010-02-12
  • 打赏
  • 举报
回复
顶点 格式为D3DFVF_XYZRHW ,我是用directx 写2d的平面程序 , 我的理解是这样的顶点坐标是不需要经过那些变换的,这样理解对吗?
所以我觉得顶点的坐标,比如某个点时(800,600),在屏幕上也应该是(800,600),但实际上不是 ,为什么呢?我的理解是并没有 经过变换啊。
butterflygogogo 2010-02-12
  • 打赏
  • 举报
回复
经过世界坐标 视图坐标 投影等变换的

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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