游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3250|回复: 6

请教一下我这个方法可不可行并问几个问题

[复制链接]

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2007-5-3 22:57:00 | 显示全部楼层 |阅读模式
小弟想做一个三维场景,里面有几个飞机的模型,再用一个模型做地面和装饰物。想实现用鼠标选中某个飞机使其旋转。不过我不想让鼠标指针显示出来,因为我这里有可以将鼠标直接定到屏幕某个地方的外设,所以意思是说用看不见的鼠标指针实现鼠标点选。
我参考了DEMO的几个例子,好像OGRE默认将鼠标移动控制镜头了,我将ExampleFrameListener.h中的moveCamera中旋转的两行注释掉了,如下,这样移动鼠标不能移动镜头,但键盘可以控制镜头行走:
void moveCamera()
        {

        // Make all the changes to the camera
        // Note that YAW direction is around a fixed axis (freelook style) rather than a natural YAW (e.g. airplane)

      //  mCamera->yaw(mRotX);
      //  mCamera->pitch(mRotY);
        mCamera->moveRelative(mTranslateVector);
        }
但是我担心在看不见鼠标的情况下能不能取到鼠标的位置坐标以实现点选。

我现在实现的程度是参考Demo_BspCollision.cpp中的射线查询的例子,实现了屏幕中心移动到哪个模型上就使得哪个模型旋转,我的frameEnded是这样写的
bool frameEnded(const FrameEvent& evt)
    {
            bool ret = ExampleFrameListener::frameEnded(evt);     

       
                rsq = mSceneMgr->createRayQuery(mCamera->getCameraToViewportRay(0.5,0.5),PLANE_QUERY_MASK);
                rsq->setSortByDistance(true,1);
                RaySceneQueryResult& rsqResult = rsq->execute();
                if (rsqResult.size() != 0)
                {
                        RaySceneQueryResult::iterator ri = rsqResult.begin();
                        RaySceneQueryResultEntry& res = *ri;
                        if(((res.movable)->getQueryFlags() & PLANE_QUERY_MASK) != 0)
                        {
                                if((res.movable)->getName() == "plane1")
                                                actPlane1 = true;                                                                //使飞机1旋转
                                else if((res.movable)->getName() == "plane2")
                                                actPlane2 = true;                                                                //使飞机2旋转
                                else               
                                        ;
                        }
               
                }

                return ret;
        }
其中有些方法很笨不过实现了也就算了,大家表见笑。不过我现在的问题是不能用“鼠标的位置”实现点选。因为这个鼠标是看不见的(不过用WINDOWNS控制面板的鼠标指针属性里有一个“当按CTRL键时显示鼠标位置”打开这个还是能看到鼠标大概在哪儿的),所以我想请教一下怎么样给射线查询的这句mSceneMgr->createRayQuery(mCamera->getCameraToViewportRay(0.5,0.5),PLANE_QUERY_MASK);中0.5,0.5换成鼠标坐标(或者告诉我根本取不到坐标T_T),小弟初入OGRE不太会取输入量,请教大家应该怎么办? [em24]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-5-3 23:05:00 | 显示全部楼层

Re:请教一下我这个方法可不可行并问几个问题

首先要通过 Viewport 得到视口的width, height.

getCameraToViewportRay(mousex/width, 1-mousey/height);

应该大概是这样了。

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2007-5-3 23:10:00 | 显示全部楼层

Re:请教一下我这个方法可不可行并问几个问题

先谢一下~~~~
呃那请问mousex    width    mousey    height这四个变量应该怎么得到呢~~应该不能直接用吧?
小弟不太会用监听器~~您可以说的详细点儿吗?先谢过~~~

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-5-3 23:28:00 | 显示全部楼层

Re:请教一下我这个方法可不可行并问几个问题

width,height 通过 Viewport 对象得到。
mousex, mousey, 用win api 就可以得到。

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2007-5-4 00:24:00 | 显示全部楼层

Re:请教一下我这个方法可不可行并问几个问题

试了下width,height 已通过 Viewport 对象得到了,先感谢一下~~~~

可是关于~鼠标的坐标~~嗯......搞不定啊..........
我试着重写
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam,  LPARAM lParam)
可是OGRE里好像已经定义了一个,反正出了100多个错。
[em4]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-5-4 15:06:00 | 显示全部楼层

Re:请教一下我这个方法可不可行并问几个问题

GetCursorPos()
再 ScreenToClient()

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2007-5-7 18:16:00 | 显示全部楼层

Re:请教一下我这个方法可不可行并问几个问题

已解决~~直接使用的GetCursorPos()谢谢帮忙~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 14:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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