如何设置约束的运动目标?

如何解决如何设置约束的运动目标?

我正在尝试在 Bullet Physics 中实现布娃娃,模仿我在使用 physx 的 Maya 插件中创建的布娃娃。除了约束电机之外,我拥有一切 1:1。

physx 中,电机仅具有线性和角度阻尼/刚度以及表示为 mat4(位置和旋转)的目标。

理想情况下,我会使用 btConeTwist,但它似乎没有线性/角电机设置,所以我已切换到 btGeneric6DofConstraint,它确实提供了可访问性,我设置如下,我觉得是对的...

// Angular
joint.dof6->getRotationalLimitMotor(0)->m_damping = joint.drive_angulardamping;
joint.dof6->getRotationalLimitMotor(1)->m_damping = joint.drive_angulardamping;
joint.dof6->getRotationalLimitMotor(2)->m_damping = joint.drive_angulardamping;
joint.dof6->getRotationalLimitMotor(0)->m_limitSoftness = (1 / joint.drive_angularstiffness);
joint.dof6->getRotationalLimitMotor(1)->m_limitSoftness = (1 / joint.drive_angularstiffness);
joint.dof6->getRotationalLimitMotor(2)->m_limitSoftness = (1 / joint.drive_angularstiffness);

// Linear
joint.dof6->getTranslationalLimitMotor()->m_damping = joint.drive_lineardampening;
joint.dof6->getTranslationalLimitMotor()->m_limitSoftness = (1 / joint.drive_linearStiffness);

问题是我找不到任何设置电机目标的方法。它必须有一个,即马达的唯一目的,将刚体旋转/平移到目标旋转/平移。

Bullet 文档至少可以说是缺乏的,任何见解或建议都是令人难以置信的。

解决方法

您应该使用 btGeneric6DofSpring2Constraint。它是所有 Bullets 约束中最灵活、功能最丰富的,也是我经验中最稳定的。从我可以告诉你的理解如何设置约束框架和约束的其余部分,所以我将跳过那部分。设置与其他所有相同。

从那里开始就很简单了。让我们从约束的简单目标速度开始。您必须启用电机,设置最大电机力,最后是目标速度。索引对应于约束中的轴。线性 X、Y 和 Z 为 0、1 和 2。旋转 X、Y 和 Z 为 3、4 和 5。旋转的目标速度以弧度为单位。所以这个例子在约束框架中创建了一个围绕 X 轴的旋转电机,它试图每秒移动 180 度。

pConstraint->enableMotor(3,true);
pConstraint->setMaxMotorForce(3,10000.0);
pConstraint->setTargetVelocity(3,M_PI);

伺服,或带有目标的电机,稍微复杂一些,但不多。它与上一节完全相同,但增加了两个内容。首先,启用伺服,并设置伺服目标。请注意,您仍然必须设置目标速度才能使其工作。伺服目标以弧度为单位旋转。所以在这个例子中,舵机试图围绕约束 X 轴旋转 90 度。

pConstraint->enableMotor(3,10.0);
pConstraint->setServo(3,true);
pConstraint->setServoTarget(3,M_PI / 2.0);

需要注意的是,btGeneric6DofSpring2Constraint 使用欧拉角,因此会受到万向节锁定。一个轴被限制为 [-PI / 2,PI / 2] 而不是完整的 360 度运动。该轴是旋转顺序中的中间轴。默认情况下,顺序为 X、Y、Z,因此 Y 轴受到约束。如果这是一个问题,您可以使用其他轮换顺序之一。

约束代码注释得体。我想你会在那里找到任何其他问题的答案。 Bullet 论坛也有一些关于约束的讨论,这些讨论很有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?