游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6627|回复: 11

[求助]OGRE实体点选问题(包围盒的方法不好用)

[复制链接]

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-12-13 13:56:00 | 显示全部楼层 |阅读模式
论坛中关于ogre实体选择都是使用包围盒的方法。对于一个倒U形门中间站一个人,我想选择人,如果使用包围盒,总是先选择到门,因为门的包围盒比人大。
如何能让程序自动判断选择到人,而不是门(怎么像绕口令...)

8

主题

98

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2006-12-13 17:48:00 | 显示全部楼层

Re:[求助]OGRE实体点选问题(包围盒的方法不好用)

基于模型三角形进行判断,或者类似gameres上一片文章,使用shader对每一模型进行渲染一唯一id,根据id判断。

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2006-12-13 20:18:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2006-12-14 00:00:00 | 显示全部楼层

Re:[求助]OGRE实体点选问题(包围盒的方法不好用)

得到和ray相交的物体队列,然后遍历,如果是门就忽略掉找下一个
其实如果门是地图上的静态场景就更简单了,可以直接用调用方法把地图屏蔽出去

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-12-14 13:55:00 | 显示全部楼层

Re:[求助]OGRE实体点选问题(包围盒的方法不好用)

把门拆成三个OBJECT不就行了..

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2006-12-14 20:00:00 | 显示全部楼层

Re: [求助]OGRE实体点选问题(包围盒的方法不好用)

simatyga: [求助]OGRE实体点选问题(包围盒的方法不好用)

论坛中关于ogre实体选择都是使用包围盒的方法。对于一个倒U形门中间站一个人,我想选择人,如果使用包围盒,...


山前住着个鲁腿粗,山后住着个鲁粗腿,俩人到山上来比腿,也不知是鲁腿粗比鲁粗腿腿粗,还是鲁粗腿比鲁腿粗粗腿。

[em7]

6

主题

76

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2006-12-15 22:43:00 | 显示全部楼层

Re:[求助]OGRE实体点选问题(包围盒的方法不好用)

你应该用的是射线查询的吧,返回的是一堆MovableObject,MovableObject有几个方法可以加入用户化数据的,如setUserObject和setUserAny,通过这些就能判断出哪个MovableObject是主角了。

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2006-12-16 18:04:00 | 显示全部楼层

Re:[求助]OGRE实体点选问题(包围盒的方法不好用)

多谢各位的提示,我的门不能排除在可选物体之外.而且我用门和人只是做一个说明,实际我要选择的这两个实体没有主次之分,而且门也不能拆成3个实体.

基于模型三角形进行判断,或者类似gameres上一片文章,使用shader对每一模型进行渲染一唯一id,根据id判断。


请教一下怎么基于三角形进行判断,基于shader渲染又是什么意思

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2006-12-18 12:48:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2006-12-22 00:45:00 | 显示全部楼层

Re:[求助]OGRE实体点选问题(包围盒的方法不好用)

官方标准的办法是通过查询的mask 只要在放入的实体中和查询时候使用相同的mask就可以直接检出。

下面的代码把两个灯光都设置为相同的mask,然后在查询的时候让场景只返回灯光的实体

const unsigned int LIGHT_QUERY_MASK = 0x00000001
Light* light1 = mSceneMgr->createLight(“Light1”);
Light* light2 = mSceneMgr->createLight(“Light2”);
light1->setPosition(12, 12, 12);
light2->setPosition(5, 5, 5);
light1->setQueryFlags(LIGHT_QUERY_MASK);
light2->setQueryFlags(LIGHT_QUERY_MASK);
AxisAlignedBoxSceneQuery* lightQuery = mSceneMgr->createAABBQuery(
AxisAlignedBox(0,0,0,10,10,10),LIGHT_QUERYMASK);


// 查询出空间内的灯光。
SceneQueryResult& results = lightQuery->excute();

// 迭代查询结果;可能只返回一个,可能是上面创建的light2。
// 迭代的类型是可移动对象类型
SceneQueryResultMovableList::iterator it = results.movalbles.begin();

for(; it != results.moveables.end(); it++)
{
     // 激活我们所有的灯光
     assert(((*it)->getQueryFlags() & LIGHT_QUERY_MASK) != 0);
     //执行对灯光的操作。
}

// 结束后销毁场景查询
mSceneMgr->destroyQuery(lightQuery);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 03:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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