我试图在opengl中制作一个弹跳骰子。遵循&#34的原则;假装它直到你做到它为止,我决定采用欠阻尼振荡器的等式并在运行骰子绘图代码之前将其应用于glTranslate()。现在,我的代码看起来像这样: -
glPushMatrix();
glDisable(GL_LIGHTING);
diceHeight=10*abs(exp(-0.01*glutGet(GLUT_ELAPSED_TIME)/100)* cos(glutGet(GLUT_ELAPSED_TIME)/500));
cout<<diceHeight;
glTranslatef(-30, diceHeight, 0);
object2.draw();
glEnable(GL_LIGHTING);
glPopMatrix();
然而,我的骰子弹跳看起来完全不自然。反正有进一步改善吗?
我真的不想进入骰子物理学。
答案 0 :(得分:2)
也许它看起来不自然,因为骰子以恒定速度移动。你需要在某处集成一些加速因子。看看简单物理here的基本欧拉积分,它很容易实现。
答案 1 :(得分:2)
继续你隐含的功能想法......
height(t) = (1 - pow(fract(pow(16, (t+0.25) * 0.6)) * 2 - 1, 2)) * 4 / pow(4, floor(pow(16, (t+0.25) * 0.6)))
这使用小数分量(fract(x) = x - floor(x)
)来执行二次反弹,每次使用地板分量按比例缩小。
就个人而言,我选择显式整合,将速度和位置变量保持为@lechariotdor链接。
答案 2 :(得分:0)
所以,我决定走自己的路线,做一个样条并沿着那个移动骰子。虽然@ jozxyk的答案是最合适的
//dice code
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
vector3f start=vector3f(-150, 100, 10);
vector3f end=vector3f(-10,10,0);
vector3f perpBisectorDirection=vector3f((start.x+end.x),(start.y+end.y),(start.z+end.z));
vector3f tan1(-(start.x-8*perpBisectorDirection.x+end.x)/6,-(start.y-8*perpBisectorDirection.y+end.y)/6, -(start.z-8*perpBisectorDirection.z+end.z)/6);
glColor3f(1.0, 0.0, 0.0);
glLineWidth(12.0);
int t=360;
if (i<=t)
{
diceRotate++;
i++;
}
float pos = (float) i / (float) t;
GLfloat x=bezierCurve(pos, start.x, tan1.x, tan1.x,end.x);
GLfloat y=bezierCurve(pos, start.y, tan1.y, tan1.y,end.y);
GLfloat z=bezierCurve(pos, start.z, tan1.z, tan1.z,end.z);
cout<<i;
glTranslatef(x, y, z);
glRotatef(diceRotate, 1, 1, 1);
object2.draw();
glPopMatrix();