我正在尝试在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)
玩得开心!