游戏开发论坛

 找回密码
 立即注册
搜索
楼主: tonykee

关于pick拾取,再次发上我写的源代码,望指正!!!

[复制链接]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2006-11-12 21:38:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

这样,非常谢谢你的关注。。。。这两天我一定会搞定偏差问题!等有了结果我会来留言说明错误的原因

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2006-11-12 23:46:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

关于拣选,以前用另外的方法实现过(每次变换把顶点数据重算,沿袭做2D时的方法),当然这个方法效率不高。
最近改写程序,又回头研究这个,那天搞了一下午,终于把除了opengl自带的那个以外的2种方法(Z,射线)
都结合变换(包括视点)实现了(自带的那个,没有测试,但是应该也可以)
没有发现有偏差,因为要选择顶点。
原本打算整理总结一下,放到blog上的,可是blog所在的网站居然正在维护。。。确实网上很多的资料都不涉及结合变换,但是明明很多软件都有实现。。。

搂住说在不做任何其他变换的情况下,也有偏差。
估计原因有2:
1。Y坐标转换。(不太清楚dx下,窗口坐标是否需要转换。如果需要,这可能是导致偏差的原因)
2。如果设置了视点的话,视点的变换需要考虑。你可以看看不设置视点,用默认的,能不能无偏差的拣选。

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2006-11-13 00:11:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

对了,对选择物体,搂住是怎么判断的,包围盒?面片?

我现在对整个物体的选择还用的是opengl自带的。虽然能很精确,但是感觉比较繁琐。想知道通用方法的思路。。。射线+多个包围盒嵌套?


BTW:大家看看我的问题吧。。。都没人回帖

http://bbs.gameres.com/showthread.asp?threadid=67410


119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2006-11-13 13:21:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

用包围体是否就不太精确了啊,而且,设置起来很麻烦

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2006-11-13 13:44:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

微软的pick里面有两套实现,有一个实现完全是自定义函数来做的,就是用到射线和三角相交的算法
假设射线是p+ q*t (p是起始点,q是方向向量,t表示时间,时间的增加射线越射越远,我是这样理解的)
那么用射线和三角相交的算法可以求出 t 还有重心坐标 u 和 v 由重心坐标就知道相交在什么地方了

三角形能判断,mesh上的所有三角都判断一次就可以了。这个做法应该是比较好的,而且与opengl dx都没关系

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2006-11-13 13:45:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

我现在很怀疑我的偏差是和屏幕设置有关系。还在进一步的找原因之中。。。。

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2006-11-13 14:19:00 | 显示全部楼层

Re: Re:关于pick拾取,再次发上我写的源代码,望指正!!!

tonykee: Re:关于pick拾取,再次发上我写的源代码,望指正!!!

微软的pick里面有两套实现,有一个实现完全是自定义函数来做的,就是用到射线和三角相交的算法
假设射线是...


听说,游戏里大多用的是包围盒+射线
并且作碰撞检测时也是包围盒的,多个嵌套下来应该也能很精确吧。

具体怎么弄就不知道了。

三角面片,也只是看过资料,有个大概思路,因为包围盒的关系所以丢到一边了。改天有空,也来做做。:)

祝你早日发现问题所在哈。

100

主题

224

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
发表于 2006-11-13 14:44:00 | 显示全部楼层

Re: 关于pick拾取,再次发上我写的源代码,望指正!!!

你的问题在于d3dpp.BackBufferWidth和d3dpp.BackBufferHeight设置不正确。
它的width和height不是CreateWindow时用的宽高,而
    GetClientRect( hwnd, &rcClient );
所得到的宽高:rcClient.right-left和bottom-top

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2006-11-13 19:00:00 | 显示全部楼层

Re: Re: 关于pick拾取,再次发上我写的源代码,望指正!!!

flipcode: Re: 关于pick拾取,再次发上我写的源代码,望指正!!!

你的问题在于d3dpp.BackBufferWidth和d3dpp.BackBufferHeight设置不正确。
它的width和height不是CreateW...

同意楼上的观点.这个也有可能.

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2006-11-13 22:44:00 | 显示全部楼层

Re:关于pick拾取,再次发上我写的源代码,望指正!!!

我终于找到问题的原因了!!!!真要开香槟庆祝一下才好!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
DWORD m_dwWindowStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE;

// Set the window's initial width
RECT rc;
SetRect( &rc, 0, 0, width, height );
AdjustWindowRect( &rc, m_dwWindowStyle, true );
//关键就是这句话了,微软的例子去掉了这句话一样也错位,如果包含菜单一定要设置为true
//我把我写的代码加上这句就OK了。。。原来是要根据窗口的风格重新计算窗格

// Create the render window
hwnd = CreateWindow( "Direct3D9App", "Direct3D9App",  m_dwWindowStyle,
        CW_USEDEFAULT, CW_USEDEFAULT,
        (rc.right-rc.left), (rc.bottom-rc.top), 0,
                LoadMenu( hInstance, MAKEINTRESOURCE(IDR_MENU1) ),
                hInstance, 0 );
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 20:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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