gpt4 book ai didi

贝塞尔曲线的 OpenGL 坐标

转载 作者:行者123 更新时间:2023-12-02 01:36:27 25 4
gpt4 key购买 nike

基本上,我需要获取从 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(该点位于曲线的终点)。

Evaluation of a Bezier cubic for t=0.35

上图的交互式版本,您可以拖动 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com