查看: 1624|回复: 3

MultiTouchTrackballManipulator中TouchData的存储问题

[复制链接]

该用户从未签到

发表于 2011-5-11 22:00:20 | 显示全部楼层 |阅读模式
  1. case osgGA::GUIEventAdapter::PUSH:
  2. 82 case osgGA::GUIEventAdapter::DRAG:
  3. 83 case osgGA::GUIEventAdapter::RELEASE:
  4. 84 if (ea.isMultiTouchEvent())
  5. 85 {
  6. 86 double eventTimeDelta = 1/60.0; //_ga_t0->getTime() - _ga_t1->getTime();
  7. 87 if( eventTimeDelta < 0. )
  8. 88 {
  9. 89 OSG_WARN << "Manipulator warning: eventTimeDelta = " << eventTimeDelta << std::endl;
  10. 90 eventTimeDelta = 0.;
  11. 91 }
  12. 92 osgGA::GUIEventAdapter::TouchData* data = ea.getTouchData();
  13. 93
  14. 94 // three touches or two taps for home position
  15. 95 if ((data->getNumTouchPoints() == 3) || ((data->getNumTouchPoints() == 1) && (data->get(0).tapCount >= 2))) {
  16. 96 flushMouseEventStack();
  17. 97 _thrown = false;
  18. 98 home(ea,us);
  19. 99 handled = true;
  20. 100 }
  21. 101
  22. 102 else if (data->getNumTouchPoints() >= 2)
  23. 103 {
  24. 104 if ((_lastTouchData.valid()) && (_lastTouchData->getNumTouchPoints() >= 2)) {
  25. 105 handleMultiTouchDrag(data, _lastTouchData, eventTimeDelta);
  26. 106 }
  27. 107
  28. 108 handled = true;
  29. 109 }
  30. 110
  31. 111 _lastTouchData = data;
  32. 112
  33. 113 // check if all touches ended
  34. 114 unsigned int num_touches_ended(0);
  35. 115 for(osgGA::GUIEventAdapter::TouchData::iterator i = data->begin(); i != data->end(); ++i) {
  36. 116 if ((*i).phase == osgGA::GUIEventAdapter::TOUCH_ENDED)
  37. 117 num_touches_ended++;
  38. 118 }
  39. 119
  40. 120 if(num_touches_ended == data->getNumTouchPoints()) {
  41. 121 _lastTouchData = NULL;
  42. 122 }
  43. 123
  44. 124 }
  45. 125 break;
复制代码


1、在MultiTouchTrackballManipulator中osgGA::GUIEventAdapter::TouchData* data = ea.getTouchData(); 如果data->getNumTouchPoints() == 3,data中这3个点是PUSH的点,还是MOVE,UP的也有?

2、else if (data->getNumTouchPoints() >= 2) ,当进行缩放或者平移时,data中的数据到底是PUSH的点,还是MOVE,UP的点?data的数据是怎么更新的,也就是说什么时候重新new TouchData。我在win7中调试GUIEventAdpter::touchBegan,GUIEventAdpter::touchMOVED,GUIEventAdpter::touchENDED发现每次都会重新new TouchData,无论是几点触摸,也就是说data->getNumTouchPoints()永远等于1,这又是怎么回事?

3、又或许是不是这样,EventQueue中的所有GUIEventAdapter共享一份TouchData?这貌似也不对,这样data个数越来越多,move,push,up的数据都存进来,与MultiTouchTrackballManipulator对不上。

谁研究过 能否交流下

该用户从未签到

发表于 2011-5-12 08:42:52 | 显示全部楼层
目前OSG中的多点触控只支持iOS,即iPhone和iPad上的实现,Windows7的实现还没有人提供。楼主有兴趣的话欢迎贡献

该用户从未签到

 楼主| 发表于 2011-5-12 12:40:12 | 显示全部楼层
回复 2# array


    我觉得是类似的。在iOS系统中,TouchData是怎么存储的,每个touch事件映射到一个鼠标事件,每个GUIEventAdapter中的TouchData是怎么样的?能否给个例子。
比如,如果触摸两点
触摸事件         映射到的鼠标事件   GUIEventAdapter中_touchData
down               PUSH                touchPoint(id1,TOUCHBEGAN,x1,y1,0)
down               PUSH                 touchPoint(id2,TOUCHBEGAN,x2,y2,0)??? 还有其他点吗?其他点是什么?
Move               Drag                  touchPoint(id1,TOUCHMOVE,x3,y3,0) ???还有其他点吗?其他点是什么?
.
.
.
.

因为在MultiTouchTrackballManipulator中handle的时候,要从 data = ea.getTouchData();
此时这个data中有几个点,而_LastTouchData中又放的是哪些点?我有点晕,array能否给以指点。

该用户从未签到

发表于 2011-5-13 08:36:10 | 显示全部楼层
我没有专门研究过iOS中的TouchData存储方式,我想您应该查阅一下相关资料或者阅读源代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表