pybullet only allow one GUI/GUI_SERVER instance.
Fix LINK_FRAME/WORLD_FRAME coordinate issue in pybullet applyExternalForce
This commit is contained in:
@@ -6080,28 +6080,30 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
|
|||||||
|
|
||||||
if ((clientCmd.m_externalForceArguments.m_forceFlags[i] & EF_FORCE)!=0)
|
if ((clientCmd.m_externalForceArguments.m_forceFlags[i] & EF_FORCE)!=0)
|
||||||
{
|
{
|
||||||
btVector3 forceLocal(clientCmd.m_externalForceArguments.m_forcesAndTorques[i*3+0],
|
btVector3 tmpForce(clientCmd.m_externalForceArguments.m_forcesAndTorques[i*3+0],
|
||||||
clientCmd.m_externalForceArguments.m_forcesAndTorques[i*3+1],
|
clientCmd.m_externalForceArguments.m_forcesAndTorques[i*3+1],
|
||||||
clientCmd.m_externalForceArguments.m_forcesAndTorques[i*3+2]);
|
clientCmd.m_externalForceArguments.m_forcesAndTorques[i*3+2]);
|
||||||
btVector3 positionLocal(
|
btVector3 tmpPosition(
|
||||||
clientCmd.m_externalForceArguments.m_positions[i*3+0],
|
clientCmd.m_externalForceArguments.m_positions[i*3+0],
|
||||||
clientCmd.m_externalForceArguments.m_positions[i*3+1],
|
clientCmd.m_externalForceArguments.m_positions[i*3+1],
|
||||||
clientCmd.m_externalForceArguments.m_positions[i*3+2]);
|
clientCmd.m_externalForceArguments.m_positions[i*3+2]);
|
||||||
|
|
||||||
|
|
||||||
if (clientCmd.m_externalForceArguments.m_linkIds[i] == -1)
|
if (clientCmd.m_externalForceArguments.m_linkIds[i] == -1)
|
||||||
{
|
{
|
||||||
btVector3 forceWorld = isLinkFrame ? forceLocal : mb->getBaseWorldTransform().getBasis()*forceLocal;
|
btVector3 forceWorld = isLinkFrame ? mb->getBaseWorldTransform().getBasis()*tmpForce : tmpForce;
|
||||||
btVector3 relPosWorld = isLinkFrame ? positionLocal : mb->getBaseWorldTransform().getBasis()*positionLocal;
|
btVector3 relPosWorld = isLinkFrame ? mb->getBaseWorldTransform().getBasis()*tmpPosition : tmpPosition - mb->getBaseWorldTransform().getOrigin();
|
||||||
mb->addBaseForce(forceWorld);
|
mb->addBaseForce(forceWorld);
|
||||||
mb->addBaseTorque(relPosWorld.cross(forceWorld));
|
mb->addBaseTorque(relPosWorld.cross(forceWorld));
|
||||||
//b3Printf("apply base force of %f,%f,%f at %f,%f,%f\n", forceWorld[0],forceWorld[1],forceWorld[2],positionLocal[0],positionLocal[1],positionLocal[2]);
|
//b3Printf("apply base force of %f,%f,%f at %f,%f,%f\n", forceWorld[0],forceWorld[1],forceWorld[2],positionLocal[0],positionLocal[1],positionLocal[2]);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
int link = clientCmd.m_externalForceArguments.m_linkIds[i];
|
int link = clientCmd.m_externalForceArguments.m_linkIds[i];
|
||||||
btVector3 forceWorld = mb->getLink(link).m_cachedWorldTransform.getBasis()*forceLocal;
|
|
||||||
btVector3 relPosWorld = mb->getLink(link).m_cachedWorldTransform.getBasis()*positionLocal;
|
btVector3 forceWorld = isLinkFrame ? mb->getLink(link).m_cachedWorldTransform.getBasis()*tmpForce : tmpForce;
|
||||||
mb->addLinkForce(link, forceWorld);
|
btVector3 relPosWorld = isLinkFrame ? mb->getLink(link).m_cachedWorldTransform.getBasis()*tmpPosition : tmpPosition - mb->getBaseWorldTransform().getOrigin();
|
||||||
mb->addLinkTorque(link,relPosWorld.cross(forceWorld));
|
mb->addLinkForce(link, forceWorld);
|
||||||
|
mb->addLinkTorque(link,relPosWorld.cross(forceWorld));
|
||||||
//b3Printf("apply link force of %f,%f,%f at %f,%f,%f\n", forceWorld[0],forceWorld[1],forceWorld[2], positionLocal[0],positionLocal[1],positionLocal[2]);
|
//b3Printf("apply link force of %f,%f,%f at %f,%f,%f\n", forceWorld[0],forceWorld[1],forceWorld[2], positionLocal[0],positionLocal[1],positionLocal[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -338,10 +338,10 @@ static PyObject* pybullet_connectPhysicsServer(PyObject* self, PyObject* args, P
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < MAX_PHYSICS_CLIENTS; i++)
|
for (i = 0; i < MAX_PHYSICS_CLIENTS; i++)
|
||||||
{
|
{
|
||||||
if (sPhysicsClientsGUI[i] == eCONNECT_GUI)
|
if ((sPhysicsClientsGUI[i] == eCONNECT_GUI) || (sPhysicsClientsGUI[i] == eCONNECT_GUI_SERVER))
|
||||||
{
|
{
|
||||||
PyErr_SetString(SpamError,
|
PyErr_SetString(SpamError,
|
||||||
"Only one local in-process GUI connection allowed. Use DIRECT connection mode or start a separate GUI physics server (ExampleBrowser, App_SharedMemoryPhysics_GUI, App_SharedMemoryPhysics_VR) and connect over SHARED_MEMORY, UDP or TCP instead.");
|
"Only one local in-process GUI/GUI_SERVER connection allowed. Use DIRECT connection mode or start a separate GUI physics server (ExampleBrowser, App_SharedMemoryPhysics_GUI, App_SharedMemoryPhysics_VR) and connect over SHARED_MEMORY, UDP or TCP instead.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user