C++ 自然反弹骰子opengl

C++ 自然反弹骰子opengl,c++,opengl,C++,Opengl,我正在尝试在opengl中制作一个跳跃骰子。按照“直到成功为止都要假装”的原则,我决定在运行骰子绘制代码之前,先将欠阻尼振荡器的方程应用于glTranslate()。现在,我的代码如下所示:- glPushMatrix(); glDisable(GL_LIGHTING); diceHeight=10*abs(exp(-0.01*glutGet(GLUT_ELAPSED_TIME)/100)* cos(glutGet(GLUT_ELAPSED_TIME)/500)); co

我正在尝试在opengl中制作一个跳跃骰子。按照“直到成功为止都要假装”的原则,我决定在运行骰子绘制代码之前,先将欠阻尼振荡器的方程应用于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(); 
glPushMatrix();
glDisable(GLU照明);
diceHeight=10*abs(exp(-0.01*glutGet(GLUT_运行时间)/100)*cos(glutGet(GLUT_运行时间)/500);

cout也许这看起来不真实,因为骰子以恒定的速度移动。你需要在某处积分一些加速度因子。看看简单物理中的基本欧拉积分,它真的很容易实现。

也许它看起来不真实,因为骰子以恒定速度移动。你需要在某处积分一些加速度因子。看看简单物理的基本欧拉积分,它很容易实现。

继续你的隐函数思想

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)
)执行二次反弹,每次使用floor分量时,二次反弹都会缩小

就个人而言,我会使用显式积分,将速度和位置变量保持为@lechariotdor链接


继续你的隐式函数想法

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)
)执行二次反弹,每次使用floor分量时,二次反弹都会缩小

就个人而言,我会使用显式积分,将速度和位置变量保持为@lechariotdor链接


所以,我决定走我自己的路,做一个样条,然后沿着它移动骰子。尽管@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();
//骰子代码
glMatrixMode(GLU模型视图);
glPushMatrix();
矢量3F开始=矢量3F(-15010010);
向量3F端=向量3F(-10,10,0);
vector3f perpBisectorDirection=vector3f((start.x+end.x),(start.y+end.y),(start.z+end.z));
向量3f 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);
GL3F(1.0,0.0,0.0);
glLineWidth(12.0);
int t=360;

如果(i是这样,我决定走我自己的路,做一个样条线并沿着它移动骰子。尽管@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();
//骰子代码
glMatrixMode(GLU模型视图);
glPushMatrix();
矢量3F开始=矢量3F(-15010010);
向量3F端=向量3F(-10,10,0);
vector3f perpBisectorDirection=vector3f((start.x+end.x),(start.y+end.y),(start.z+end.z));
向量3f 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);
GL3F(1.0,0.0,0.0);
glLineWidth(12.0);
int t=360;

if(我什么是分形?分数部分?什么是分形?分数部分?嘿!我试过你的答案,但运动非常粗糙(可能是因为我加载了很多对象).为了其他人的利益,你能解释一下如何以独立于帧的方式执行此操作吗?你所说的“独立于帧的方式”是什么意思?具有固定的恒定时间步长?是的。基本上,不考虑硬件的情况下,它的性能同样好。使用固定的时间步长不会使它在不同类型的硬件上运行良好。更快硬件将运行得更快,而较慢的硬件将运行得更慢(或者您需要设置一个最慢硬件可以匹配的低帧速率限制)。要使其在不同的硬件上运行良好,您需要计算两帧之间的时间差,并使用此增量更新骰子位置。使其具有时间依赖性将使其在不同类型的硬件上一致运行。只有在您需要精确预测每一步时,固定时间步长才有用(为了重播,联网,…)嘿!我试过你的答案,但动作很不协调(可能是因为我加载了很多对象).为了其他人的利益,你能解释一下如何以独立于帧的方式执行此操作吗?你所说的“独立于帧的方式”是什么意思?具有固定的恒定时间步长?是的。基本上,不考虑硬件的情况下,它的性能同样好。使用固定的时间步长不会使它在不同类型的硬件上运行良好。更快硬件将运行得更快,而较慢的硬件将运行得更慢(或者您需要设置一个最慢硬件可以匹配的低帧速率限制)。要使其在不同的硬件上运行良好,您需要计算两帧之间的时间差,并使用此增量更新骰子位置。使其具有时间依赖性将使其在不同类型的硬件上一致运行。只有在您需要精确预测每一步时,固定时间步长才有用(用于重播、联网等目的)