在Pyopengl中为3D汽车进行动画动画



我正在尝试在pyopengl中为3D汽车进行动画,以使其沿着八形轨道移动。问题是我似乎找不到使汽车沿着轨道曲线转动的最佳方法。

我尝试的方式是使汽车在X和Z轴上进行替代,并使Glrotate旋转汽车,但这似乎不是最好的方法。

我的代码看起来像这样:

 # Values for all the animation process, including translate and rotate
 angulo = 0.0
 traslacion = 0.0
 giroXl = 0.0
 giroZl = 0.0
 ...
 # The display function, where the 3D car model recieves the intructions for 
 # the movement along the track
 def display():
     ...
     glTranslate(0, 0, traslacion)  # Moves the car along a straight line, this works just fine
     # This is where I try to turn the car along the track curve, this is where I'm stuck
     if bandRecta == True:
        glTranslate(giroXl, 0, giroZl)
        glRotate(angulo, 0.0, 1.0, 0.0)
 # The glutTimerFunc, where the values get manipulated
 def movimiento():
     ...
     angulo = angulo + (1.0 if angulo < 180.0 else 0.0)
     traslacion = traslacion + (1.0 if traslacion < 100.0 else 0.0)
     if traslacion == 50:
          bandRecta = True 
          giroXl = giroXl + (1.0 if giroXl < 50.0 else 0.0)
          giroZl = giroZl + (1.0 if giroZl < 50.0 else 0.0)

你们能给我一些有关如何使汽车转向的建议吗?谢谢。

我可以想到两种做到这一点的方法。(我不是Python程序员,所以这不会是完整的语法。)

我想您的轨道在Z方向前方沿r单元,然后穿过半径为r。

的圆圈的3/4

使旋转位于点-r,0,r左右,而不是0,0,0。这涉及旋转之前和之后的额外翻译()。

将t视为轨道上的总距离(traslacion)。不要直接在transpate()中使用t。将轨道分解为这样的细分市场:

if (T<=R)
    theta = 0
    Z = T
    X = 0
else if (T < R * (1 + 3/2 * PI))
    theta = (T/R-1)
    Z = R # limit of straight travel
    X = 0
else if (T < R * (3 + 3/2 * PI))
    theta = 3/2 * PI
    Z = R
    X = T - R * (1 + 3/2 * PI)) # now travelling straight in X
else # you work out the other pole of the track

在曲目的第一杆中绘制:

glTranslate(0, 0, Z) # add Z from straight portion of track
# rotate about pole at -R, 0, R
glTranslate(R, 0, -R)
glRotate(180 * theta / PI), 0, 1, 0)
glTranslate(-R, 0, R)
# add X from after the curve
glTranslate(X, 0, 0) 

这将使您到第二回合(将具有不同的中心)。

注意

PI = math.pi

使用参数函数

我可以想到的第二种方法是使用参数函数fx,z(t)

要旋转汽车,您需要知道衍生的FX1和FZ1并使用Atan来弄清楚标题。

如果您定义

Fx = cos(T * K) 
Fz = sin(T * L) 

您可以拥有一个八的数字,k = 0.5,l = 1。

但是,数学和图纸很简单:

Fx1 = -K * sin(T * K)
Fz1 = L * cos ( T * L)
theta = atan(Fz1/Fx1) if Fx1 != 0 else sign(Fz1)*PI/2
glRotate(180 * theta / PI, 0, 1, 0)
glTranslate(Fx, 0, Fz)

玩得开心!

相关内容

  • 没有找到相关文章

最新更新