- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
抱歉,如果这是重复的,但我正在尝试找出 SoRayPickAction 在 Open Inventor 中的实现。我正在尝试实现它,以便在单击鼠标时选择一个特定节点,以便我可以平移、旋转等。我有三个节点: table 、灯和框架(相框)。但是,我不认为我的代码是正确的。我还有各种方法,例如 MouseButtonCallback(它将检查鼠标是否被单击,然后使用导航器)和 MouseMoveCallback(相同的想法)。所以这是我的代码,但是你有什么建议吗?现在,好吧,它什么也没做。
SbViewportRegion viewport(400,300);
SoRayPickAction m(viewport);
m.setRay(SbVec3f(0.0,0.0,0.0), SbVec3f(0.0,0.0,-1.0));
m.apply(callback_node);
const SoPickedPoint *mpp = m.getPickedPoint();
if(mpp != NULL) {
std::cout << "test" << std::endl;
}
您可能还知道 OpenInventor 中的一个 Action ,可以在场景中“放置”一个节点,即将灯放在 table 上,将框架放在墙上等。它有路径吗?不幸的是,我什至不知道我在寻找什么。非常感谢您的帮助!!
编辑:这看起来怎么样? SoSeparator *desk2; SoSeparator *lamp2; SoSeparator *pic_frame2; SoSeparator *picked;
void MouseButtonCallback(void* data, SoEventCallback* node)
{
SoHandleEventAction* action = node->getAction();
const SoMouseButtonEvent* event = static_cast<const SoMouseButtonEvent*>(action- >getEvent());
Navigator* nav = static_cast<Navigator*>(data);
if (SoMouseButtonEvent::isButtonPressEvent(event, event->getButton()))
nav->OnMouseDown(event, action);
else
nav->OnMouseUp(event, action);
const SbViewportRegion & viewportRegion = action->getViewportRegion();
SoRayPickAction pickAction(viewportRegion);
SbVec2s mousePos = event->getPosition(viewportRegion);
pickAction.setPoint(mousePos);
pickAction.setPickAll(TRUE);
pickAction.setRadius(2.0F);
pickAction.setRay(SbVec3f(0.0,0.0,0.0), SbVec3f(0.0,0.0,-1.0));
pickAction.apply(node);
const SoPickedPoint *mpp = pickAction.getPickedPoint();
if(mpp != NULL) {
SoPath *path = mpp->getPath();
if(desk2 != NULL && path->containsNode(desk2))
{ //but this doesn't respond with cout when I try to test it :(
if (SoMouseButtonEvent::isButtonPressEvent(event, event->getButton()))
*picked = *desk2;
}
else if(lamp2 != NULL && path->containsNode(lamp2))
{
if (SoMouseButtonEvent::isButtonPressEvent(event, event->getButton()))
*picked = *lamp2;
}
else if(pic_frame2 != NULL && path->containsNode(pic_frame2))
{
if (SoMouseButtonEvent::isButtonPressEvent(event, event->getButton()))
*picked = *pic_frame2;
}
action->setHandled();
}
void MouseMoveCallback(void* data, SoEventCallback* node)
{
SoHandleEventAction* action = node->getAction();
const SoLocation2Event* event = static_cast<const SoLocation2Event*>(action->getEvent());
Navigator* nav = static_cast<Navigator*>(data);
nav->OnMouseMove(event, action);
const SbViewportRegion & viewportRegion = action->getViewportRegion();
SoRayPickAction pickAction(viewportRegion);
SbVec2s mousePos = event->getPosition(viewportRegion);
pickAction.setPoint(mousePos);
pickAction.setPickAll(TRUE);
pickAction.setRadius(2.0F);
pickAction.setRay(SbVec3f(0.0,0.0,0.0), SbVec3f(0.0,0.0,-1.0));
pickAction.apply(node);
const SoPickedPoint *mpp = pickAction.getPickedPoint();
if(mpp != NULL) {
SoPath *path = mpp->getPath();
if(desk2 != NULL && path->containsNode(desk2))
{
*picked = *desk2; //can't remember how to set pointers, will figure that out
}
else if(lamp2 != NULL && path->containsNode(lamp2))
{
*picked = *lamp2;
}
else if(pic_frame2 != NULL && path->containsNode(pic_frame2))
{
*picked = *pic_frame2;
}
}
action->setHandled();
}
(part of main method)
//desk
SoTransform *desk_transform = new SoTransform;
desk_transform->translation.setValue(SbVec3f(380,340,330));
SoSeparator* desk2 = new SoSeparator();
desk2->addChild(desk_transform);
desk2->addChild(desk);
root->addChild(desk2);
SoTransformerManip* picked_transform = new SoTransformerManip();
picked_transform->translation.setValue(SbVec3f(200,340,330));
SoSeparator* pick2 = new SoSeparator();
pick2->addChild(picked_transform);
pick2->addChild(picked);
root->addChild(pick2);
std::auto_ptr<btCollisionShape> picked_shape(new btBoxShape(btVector3(10.0f, 10.0f, 10.0f)));
CollisionEngine* picked_collision = new CollisionEngine(collision_world.get(), picked_shape.get());
picked_collision->translation_in.connectFrom(&picked_transform->translation);
picked_collision->rotation_in.connectFrom(&picked_transform->rotation);
picked_transform->translation.connectFrom(&picked_collision->translation_out);
最佳答案
您已经选择了点。然后,您会得到一个 SoPath
,如您所料。然后查看该路径是否包含您要对其执行某些操作的节点。
SbViewportRegion viewport(400,300);
SoRayPickAction m(viewport);
m.setRay(SbVec3f(0.0,0.0,0.0), SbVec3f(0.0,0.0,-1.0));
m.apply(callback_node);
const SoPickedPoint *mpp = m.getPickedPoint();
if(mpp != NULL) {
std::cout << "test" << std::endl;
SoPath * path = pickedPoint->getPath();
if (deskSeparator != NULL && path->containsNode(deskSeparator)
{
}
else if (lampSeparator != NULL && path->containsNode(lampSeparator)
{
}
else if (radomeSeparator != NULL && path->containsNode(radomeSeparator)
{
if ( SoMouseButtonEvent::isButtonPressEvent( event, SoMouseButtonEvent::BUTTON2 )
|| ( SoMouseButtonEvent::isButtonPressEvent( event, SoMouseButtonEvent::BUTTON1 ) && event->wasShiftDown() ) )
{
modelPointMoving = true;
const SoDetail * detail = modelPickedPoint->getDetail( 0 );
int face = -1;
if ( detail && detail->isOfType( SoFaceDetail::getClassTypeId() ) )
{
const SoFaceDetail * faceDetail = static_cast<const SoFaceDetail *>( detail );
face = faceDetail->getFaceIndex();
}
updateStatusBar( face, point.getValue(), normal.getValue() );
graphicModel.postNote( pickedPoint );
break;
}
else if ( SoMouseButtonEvent::isButtonPressEvent( event, SoMouseButtonEvent::BUTTON1 ) )
{
}
else if ( SoMouseButtonEvent::isButtonReleaseEvent( event, SoMouseButtonEvent::BUTTON1 ) )
{
}
}
}
你最终会像这样将拾取射线连接到鼠标位置:
// Set an 2-pixel wide region around the pixel.
SbVec2s mousePosition = event->getPosition( viewportRegion );
pickAction.setPoint( mousePosition );
pickAction.setPickAll( TRUE );
pickAction.setRadius( 2.0F );
当然,这是在您 .apply()
选择操作之前完成的。
我想我的代码是你和我的混合体,但我认为它应该给你一个开始。此外,它位于处理鼠标事件的函数中:
void
RenderWindow::mouseEvent( void *, SoEventCallback * eventCallback )
{
const SoEvent *event = eventCallback->getEvent();
if ( ! event )
{
qDebug() << " ** Error in mousePressCallback: Event not found.";
return;
}
//SoType eventType = event->getTypeId();
//SbName eventTypeName = eventType.getName();
//const char * eventTypeString = eventTypeName.getString();
SoHandleEventAction * action = eventCallback->getAction();
const SbViewportRegion & viewportRegion = action->getViewportRegion();
SoRayPickAction pickAction( viewportRegion );
在主例程或设置例程中,我注册了鼠标事件(用于单击操作和位置(将鼠标移到视口(viewport)上):
// Add a mouse event callback to catch mouse button presses.
SoEventCallback * mouseEventCallback = new SoEventCallback();
mouseEventCallback->setName( "MOUSE_EVENT_CALLBACK" );
mouseEventCallback->addEventCallback( SoMouseButtonEvent::getClassTypeId(), &::mouseEvent, static_cast<void *>( this ) );
// Add a mouse event callback to catch mouse motion.
mouseEventCallback->addEventCallback( SoLocation2Event::getClassTypeId(), &::mouseEvent, static_cast<void *>( this ) );
rootSeparator->addChild( mouseEventCallback );
现在我看着它,我以相反的顺序写了这些 block ;-)。对不起。
祝你好运
关于c++ - Open Inventor 中的 SoRayPickAction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607792/
我想开发一个需要小型数据库的简单 Android 应用程序。我已经用 App Inventor 和 TinyDB 开发了一个原型(prototype),但似乎 TinyDB 允许使用相同的“标签”向数
我发布了具有许多屏幕的应用程序,但现在我想返回并为这些屏幕添加新功能。有什么方法可以让我将新 block 创建一次作为模板并将其粘贴到新屏幕上? 最佳答案 复制粘贴代码块不是一个好主意:您应该考虑重新
在谷歌于 2011 年 12 月 31 日停止支持 Android App Inventor 后,它已被麻省理工学院 - 移动学习中心接管,并将于 2012 年第一季度重新推出其服务以供公众访问。 目
开始在 Windows 7 上评估 MIT App Inventor(ver 2.2)(来自 Administrator 帐户)。由于我没有 Android 设备,所以我必须使用模拟器。 aiStar
我为一个项目创建了一个应用程序,它只是一个小测验应用程序,我希望分数在用户每次答对问题时更新,而在他们答错问题时不改变,每个问题都在一个新的屏幕,此时分数会更新,但是当出现下一个问题的新屏幕时,分数不
我已经在网上搜索过这个问题,但找不到解决方案,所以决定在这里发布一个问题。 我想在 App Inventor 中显示一个对象列表。 定义对象的类的字段例如: 文字内容数量估计长度数字重要性 如何存储上
我使用 App Inventor 为 Android 开发了一个简单的测试应用程序。我已将 .apk 文件发送到我的智能手机,安装并测试它。该应用程序只有一个带有 2 个按钮的屏幕 View :播放和
我的场景图中有一些分隔符,例如 table 、灯和框架。当我将它们添加到一个名为“root”的分隔符时,它们会被制成节点吗?就像我想将它们与路径一起使用一样,是否有等同于 path->contains
我正在与应用程序发明者一起编程,我希望我的应用程序支持所有屏幕分辨率和纵横比以及背景图像和其他内容根据屏幕大小调整大小。我怎样才能做到这一点? 更具体地说,我有一个 Canvas 填充父项,我希望这个
我有一个带有 AppInventor 2 的应用程序,它基本上包含一个网站上的游戏和下部的一个返回主屏幕的按钮。该游戏使用 Ajax 在用户点击后加载一些问题。有时,问题可能很长,文档高度会增加,向下
我刚刚使用App Inventor 2创建了一个应用程序。单击“生成”,然后将其保存在“计算机”上。然后将.apk上传到我的Google开发者控制台帐户中。 但是,上传完成后会显示: Upload f
我是麻省理工学院应用程序发明者工具的初学者。我坚持在屏幕之间传递数据。我在互联网上搜索了很多时间。我有意图地使用事件启动器得到了很多结果,但是在 MIT 应用程序发明者中怎么可能呢? 如果在andro
我目前正在尝试学习 AppInventor2 工具,方法是编写类似于应用 Inventor 库 (Balance Meter) 中列出的横滚和纵摇应用程序。 我想做的是通过在达到某些值时触发声音来增强
我是 App Inventor 的初学者,我不知道我在使用 listpicker 时做错了什么。我正在尝试创建和应用程序来重现我存储在服务器中的音乐,但是当我显示 listpicker 时,我无法单击
我想弄清楚如何创建一个多个设备可以访问的数据库,这将用于短信应用程序。不过,我不想在此应用程序中使用电话号码或蓝牙。我已经知道如何做到这一点;但是,我想制作一个可以将 2 个以上其他设备连接在一起并具
我正在使用智能手机使用 App Inventor 2 将每日报告保存到数据库 (Mysql)。当我使用所有类型的三星智能手机尝试我的应用程序时,它显示这样的错误。 Samsung notificati
在应用程序发明者中使用 Shival wolfs WolfWebEmail2 通过 Google 应用程序引擎发送邮件,收件人电子邮件中没有任何内容。 需要确认我的代码是否正确。 未在应用引擎上显示任
我想在我的测验应用程序中添加一个高分屏幕。我已经创建了一个带有起始值的高分屏幕,其中包含用户在上一轮中达到的分数、类别名称和难度。 我将这个起始值分成 2 个变量: 第一个只包含分数,另一个包含类别和
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
抱歉,如果这是重复的,但我正在尝试找出 SoRayPickAction 在 Open Inventor 中的实现。我正在尝试实现它,以便在单击鼠标时选择一个特定节点,以便我可以平移、旋转等。我有三个节
我是一名优秀的程序员,十分优秀!