我要发帖 回复

正式会员

22

主题

85

积分

0

专家分

:

私信
发表时间 : 2007-10-17 11:08:29 | 浏览 : 9759    评论 : 29
如题

最近VR访客查看更多↓

obuil 评论于2007-10-17 12:50:06
建立:
vpMotionUFO *motion = *vpMotionUFO::begin();
        vpInputMouse *mouse = new vpInputMouse();
        mouse->setWindow(*vpWindow::begin());
        mouse->setChannel(*vpChannel::begin());
        motion->setInput(mouse);
使用:
vpInputMouse *mouse = *vpInputMouse::begin();
            vpInputSourceFloat *sourceX = mouse->getSourceFloat(
                vpInputMouse::SOURCE_FLOAT_POSITION_X);
            vpInputSourceFloat *sourceY = mouse->getSourceFloat(
                vpInputMouse::SOURCE_FLOAT_POSITION_Y);
wenxuanwenya 评论于2007-10-17 13:41:17
版主真是好人
morty 评论于2007-10-17 14:40:43
谢谢版主指点!
不过依照版主的办法,并使用坐标转换,将鼠标坐标转换为世界坐标,该坐标应该是鼠标所在位置的世界坐标,而我想得到鼠标所指的模型上的一点的坐标,是不是必须用碰撞检测才能得到呀?
morty 评论于2007-10-17 17:33:44
我做了碰撞检测,结果坐标时对时不对,并且存在内存泄漏。
请高人指点一下碰撞检测的流程。
morty 评论于2007-10-18 09:50:55
CMouse::CMouse(vpWindow *window,vpChannel *channel,HWND m_hWnd)
{
        this->m_channel = channel;
        this->m_hWnd = m_hWnd;
        m_mouse = new vpInputMouse();
        m_mouse->setWindow(window);
        m_mouse->setChannel(channel);
        m_mouse->ref();
        vpInputMouse::const_iterator_source_float fit;
        for (fit=m_mouse->begin_source_float();fit!=m_mouse->end_source_float();++fit) {
                        (*fit)->addSubscriber(vpInputSourceFloat::EVENT_VALUE_CHANGED, this);
        }
        //碰撞检测
        UINT mask = 0xFFFFFFFF;
        m_isector = new vpIsectorLOS();
        m_isector->setTarget(*vpScene::begin());
        m_isector->setIsectMask(mask);
        m_isector->ref();
}
CMouse::~CMouse(void)
{
        m_isector->unref();
        vpInputMouse::const_iterator_source_float fit;
        for (fit=m_mouse->begin_source_float();
                fit!=m_mouse->end_source_float();++fit) {
                        (*fit)->removeSubscriber(
                                vpInputSourceFloat::EVENT_VALUE_CHANGED, this, true);
                }
        m_mouse->unref();
}

void CMouse::notify(vpInputSourceFloat::Event, vpInputSourceFloat *publisher)
{
        float n,f;
        vuVec3<float> mouse(vpInputMouse::SOURCE_FLOAT_POSITION_X,vpInputMouse::SOURCE_FLOAT_POSITION_Y, -1);
        vuVec3<double> vec;
        vuMatrix<float> projInv;
        const vuMatrix<double> &viewMat = m_channel->getViewMatrix();
        m_channel->getNearFar(&n,&f);
        projInv.invert(m_channel->getVrChannel()->getProjectionMatrix());
        projInv.transformPoint(&mouse);
        m_channel->getVrChannel()->getOffsetMatrixInverse(
                ).transformPoint(&mouse);
        m_channel->getVrChannel()->getViewMatrix().transformPoint(&mouse);
       
        double x,y,z,h,p,r=0.0;

       
        x = viewMat[3][0];
        y = viewMat[3][1];
        z = viewMat[3][2];

        vec[0] = mouse[0] - x;
        vec[1] = mouse[1] - y;
        vec[2] = mouse[2] - z;

        h = vuRad2Deg(-vuArcTan(vec[0], vec[1]));
        p = vuRad2Deg(vuArcTan(vec[2],vuSqrt(vuSq(vec[0]) + vuSq(vec[1]))));
        m_isector->setTranslate(x, y, z);
        m_isector->setRotate(h, p, 0.0);
        m_isector->setSegmentRange(2*f);
        m_isector->update();
        if (m_isector->getHit()) {
                vuVec3<double> *point=new vuVec3<double>;
                if(m_isector->getHitPoint(point)==vsgu::SUCCESS){
                        point->get(&x,&y,&z);
                }
        }

        Position *pp = new Position;
        pp->x=x;
        pp->y=y;
        pp->z=z;
        SendMessage(m_hWnd,WM_MOUSEPOSITION,(WPARAM)pp,0);
}

----------------------------------------------------------------------------------------------------------------------------
上面是我的部分代码,用来转换鼠标的屏幕坐标,并做碰撞检测vpIsectorLOS来取得鼠标所指点的模型坐标,请高手看看是否正确,还有碰撞检测代码存在内存泄漏,谁能说下应该怎么改
obuil 评论于2007-10-18 11:38:18
从本版块中找找 我的一个帖子 vpPicker
morty 评论于2007-10-18 17:08:44
谢谢版主,我终于搞定了。
xmgcoffee 评论于2007-11-1 00:20:27
机器余专家组 认证企业会员 评论于2007-12-15 22:07:36
持支,朱
297006329 评论于2007-12-16 15:33:58
学习!
ixidof 评论于2007-12-26 21:33:10
学习!
wangxueping 评论于2008-1-13 16:05:07
学习学习
xiaolingis 评论于2008-1-18 20:33:17
恩,写的不错
zjw86212 评论于2008-10-16 12:46:37
为什么我一运行vpInputMouse *mouse = new vpInputMouse();) 就会报错啊~~~??
错误如下:

vp_mfcD.exe 中的 0x007572d7 (vsgu2_0D.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突 。

错误指向的是这段代码:(vubase.h中的)

        vuBase*  operator*() const {  return *m_instance; }

        ConstIteratorInstanceImpl& operator++()
        {
            if(m_derived && m_base) {
                ++m_instance;
                peek();
            }
            return *this;
        }


不知道为什么??希望高人指点
evidence 评论于2008-10-20 14:59:47
这个个人猜测是你的游标进行++操作后越界了,所以出现访问的地址有错
忙项目中~~~~
ycj20021111 评论于2008-11-7 13:58:09
学习学习
huxiaobo 评论于2010-3-25 20:23:03
不知道能不能看懂哦
danielqiu 评论于2010-3-25 22:32:41
版主很强大
海棠 评论于2011-4-14 16:52:47
谢谢分享

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-9-22 07:00 PM

返回顶部