作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上,我需要获取从 OpenGL 中的贝塞尔曲线实现绘制的所有坐标。具体来说,我需要坐标来沿着弯曲的轨迹路径移动场景中的球体对象(棒球)。这是我用来绘制曲线的:
GL2 gl = drawable.getGL().getGL2();
float ctrlpoints[][] = new float[][]{
{0.0f, 0.0f, 60f},
{0.0f, 3.0f, 45.0f},
{0.0f, 2.0f, 15.0f},
{0.0f, 1.0f, 0f}};
FloatBuffer ctrlpointBuf = FloatBuffer.allocate(ctrlpoints[0].length * ctrlpoints.length);
for (int i = 0; i < ctrlpoints.length; i++) {
for (int j = 0; j < 3; j++) {
ctrlpointBuf.put(ctrlpoints[i][j]);
}
}
ctrlpointBuf.rewind();
gl.glMap1f(GL2.GL_MAP1_VERTEX_3, 0.0f, 1.0f, 3, numControlPoints, ctrlpointBuf);
gl.glEnable(GL2.GL_MAP1_VERTEX_3);
gl.glColor3f(1.0f, 1.0f, 1.0f);
gl.glBegin(GL2.GL_LINE_STRIP);
for (int i = 0; i <= 30; i++) {
gl.glEvalCoord1f((float) i / (float) 30.0);
}
gl.glEnd();
有人知道如何从这个实现中获得要点吗?
最佳答案
贝塞尔曲线很容易计算。首先是可分离的,这意味着您可以一次计算一个坐标(首先是 x,然后是 y,然后是 z...)。对于给定的坐标,以下是使用定义的函数:
double bezier(double A, // Start value
double B, // First control value
double C, // Second control value
double D, // Ending value
double t) // Parameter 0 <= t <= 1
{
double s = 1 - t;
double AB = A*s + B*t;
double BC = B*s + C*t;
double CD = C*s + D*t;
double ABC = AB*s + BC*t;
double BCD = BC*s + CD*t;
return ABC*s + BCD*t;
}
请注意,在上述函数中,参数 t
不是曲线的弧长参数,而是来自 t=0
的通用参数(其中点位于曲线的起点)到 t=1
(该点位于曲线的终点)。
上图的交互式版本,您可以拖动 A、B、C、D 和 AB 点 is available here 。它是用 html/js/canvas 实现的,并且仅在 Chrome、Firefox、Safari 上进行了测试。
如果您需要在 XYZ 中以受控的特定速度移动对象,一种简单的方法是计算近似折线(例如,通过对曲线采样 100 个 t
值),然后以在生成的折线上保持恒定速度。
贝塞尔三次曲线的真实弧长参数化(即使用沿曲线测量的长度参数)计算起来相当烦人(IIRC,积分没有封闭形式的解)。
关于贝塞尔曲线的 OpenGL 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443653/
我是一名优秀的程序员,十分优秀!