65.9K
CodeProject 正在变化。 阅读更多。
Home

交互式水效果多点触控

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (10投票s)

2011年2月1日

CPOL

2分钟阅读

viewsIcon

40337

downloadIcon

2457

使用 Tuio 库实现交互式水效果多点触控

引言

我在 CodeProject 上找到了一篇很棒的文章:交互式水面效果。

它很不错,因为你可以通过鼠标点击在平面上产生波纹。

但是,我制作了一个 多点触控桌,并将程序适配了它。所以,我与大家分享我的代码。

视频示例可以在这里找到:http://www.youtube.com/watch?v=EkZDBLxMX9U

背景

有趣的地方在于(因为有些人可能会说,嗯,为什么写一篇关于这个的文章)是开源的 tuio 库 (http://www.tuio.org/?cpp)。
tuio 库使用 UDP 发送触摸事件。有关多点触控桌的更多信息,请参阅 tuio lib C++ 在 OpenGL 应用程序中的实现示例。

Using the Code

tuio lib 提供了一个类 TuioListener,它提供了用于触摸 Event 的方法。

项目在 msvc 中是

projetscreenshot.jpg
在“交互式水面效果”的文章中,该项目是一个 OpenGL 程序。

为了实现 tuiolib,我创建了一个类 TuioDemo。这个类有一个构造函数

TuioDemo(int port)    
 {             
 tuioClient = new TuioClient(port);      
 tuioClient->addTuioListener(this);       
 tuioClient->connect();     
 if (!tuioClient->isConnected()) {          
      }     
 } 

端口是用于连接到检测触摸的软件的 UDP 端口号。我的 TuioDemo 继承自 TuioListener ,并且必须实现以下方法

void addTuioObject(TuioObject *tobj) { }  
void updateTuioObject(TuioObject *tobj) { } 
void removeTuioObject(TuioObject *tobj){ } 
void addTuioCursor(TuioCursor *tcur);
void updateTuioCursor(TuioCursor *tcur);
void removeTuioCursor(TuioCursor *tcur);
        
void refresh(TuioTime frameTime) { }    

TuioListener 是一种设计模式:观察者模式。

所有 ***TuiObject 方法都存在于将附着在物理对象上的信标标记放置到用户时。因此,对于这篇文章来说并不有趣。

其他的 ***TuioCursor 是用于手指触摸的。

void addTuioCursor(TuioCursor *tcur);      When a finger touch the surface
void updateTuioCursor(TuioCursor *tcur);   When a finger move    
void removeTuioCursor(TuioCursor *tcur);   When a finger untouch. 

TuioCursor 获取一些有用的信息,例如:x_pos y_pos,可以通过方法 getX()getY() 访问。

我创建了 TuioDemo 的另一个方法

void showWave(dmFlotte *flotte)
{         
    std::list<TuioCursor*> lstCursor = tuioClient->getTuioCursors();
    std::list<TuioCursor*>::iterator tcur; 
    for (tcur=lstCursor.begin(); tcur!= lstCursor.end(); tcur++) {                   
        flotte->setWave((*tcur)->getX(),-(*tcur)->getY(),  128);
    } 
}

这会根据多点触控表面上同时进行的所有触摸来更新平面。
“flotte”变量(在英语俚语中,意思是水)描述了水面上所有的扰动。此方法在 OpenGL 的更新中调用

void display(void)

关注点

我希望这篇文章能帮助人们使用 tuio 库。

如果您遇到问题,请告诉我。

我正在找工作,所以如果您有兴趣雇佣我,请告诉我。我的电子邮件地址是 charles.vidal ( at ) gmail dot com。

历史

  • 2011 年 2 月 1 日:初始发布
© . All rights reserved.