本文目的,分析如何产生一个球面上的力(方向垂直于球面)
继续分析官方demo
在 FrictionlessSphere demo 中,创建了一个球面,由于球面各店的法向量均不相同,相对于上一个demo中平面的力计算要稍微复杂一点点。
其中 main 函数没有变化,只是回调函数的逻辑发生更改
HDCallbackCode HDCALLBACK FrictionlessSphereCallback(void *data)
{
const double sphereRadius = 40.0;
const hduVector3Dd spherePosition(0,0,0);
// 硬度
const double sphereStiffness = .25;
hdBeginFrame(hdGetCurrentDevice());
// device 位置.
hduVector3Dd position;
hdGetDoublev(HD_CURRENT_POSITION, position);
// device 位置和球心距离
double distance = (position-spherePosition).magnitude();
// 当刺破球面时
if (distance < sphereRadius)
{
// 计算穿刺距离
double penetrationDistance = sphereRadius-distance;
// 球心到位置方向向量
hduVector3Dd forceDirection = (position-spherePosition)/distance;
// 计算力
double k = sphereStiffness;
hduVector3Dd x = penetrationDistance*forceDirection;
hduVector3Dd f = k*x;
hdSetDoublev(HD_CURRENT_FORCE, f);
}
hdEndFrame(hdGetCurrentDevice());
HDErrorInfo error;
if (HD_DEVICE_ERROR(error = hdGetError()))
{
hduPrintError(stderr, &error, "Error during main scheduler callback\n");
if (hduIsSchedulerError(&error))
{
return HD_CALLBACK_DONE;
}
}
return HD_CALLBACK_CONTINUE;
}