我正在使用blender游戏引擎和python我制作了一个空白的脚本跟随我在3D空间中的光标。 (我现在用键盘作为高度)。 现在我想使用python为一般对象而不是摄像头实现LookAt函数。我希望对象能够准确地看到我在屏幕上悬停(空位)的点。现在我使用的是立方体,所以基本上立方体的一个面应该总是面向空的。 所以,我想过使用矩阵或四元数,但问题是我只有一个方向向量,我选择x轴作为局部外观方向。因此无论哪种方式,我都需要计算欧拉角并将它们转换为轴旋转角度。 (希塔* [^轴线])。
我在Blender游戏引擎中拥有的资源是:mathutils(提供四分之一,基于euler的旋转(通过轴角度),矩阵) - 虽然它没有任何更新的文档,这是非常可怕的!我必须打印帮助以获得某种信息! 现在,当我只旋转Z轴时,我已经能够使对象看空。我使用了一个小技巧,使用简单的三角函数处理角度符号,因此符号处理,我不需要任何矩阵技巧或四分之一。当我再次尝试旋转时问题就开始了 - 我想旋转Y轴进行上下观察(如3D中所知,我们需要两种旋转来面对某人,第三种只是将视图颠倒旋转 - "滚动camrea")因为此旋转轴是外观方向向量。 这是我的剧本:
import bge
from mathutils import Vector, Matrix
import math
# Basic stuff
cont = bge.logic.getCurrentController()
own = cont.owner
scene = bge.logic.getCurrentScene()
c = scene.objects["Cube"]
e = scene.objects["Empty"]
# axises (we're using localOrientation)
x = Vector((1.0,0.0,0.0))
y = Vector((0.0,1.0,0.0))
z = Vector((0.0,0.0,1.0))
vec = Vector(e.worldPosition - c.worldPosition) # direction vector
# Converting direction vector into euler angles
# Using trigonometry we get: tan(psi) = cos(phi2)/cos(phi1)
# Where phi1 is the angle between x axises (euler angle)
# and phi2 is the euler of the y axises.
# psi is the z rotation angle.
# get cos(euler_angle)
phi1 = vec.dot(x)/vec.length # = cos p1
phi2 = vec.dot(y)/vec.length # = cos p2
phi3 = vec.dot(z)/vec.length # = cos p3
# get the rotation/steer angles
zAngle = math.atan(phi2/phi1)
yAngle = math.atan2(phi3,phi1)
xAngle = math.atan(phi2/phi3)
# use only 2 as the third must adapt (also: view concept - x is the looking direction, rotating it would make rolling)
r = c.localOrientation.to_euler()
r.z = zAngle
r.y = -yAngle
#r.x = xAngle
c.localOrientation = r
单独地每个轴都可以完美地工作,但是当组合时,当我通过全局Y轴时几乎没有跳跃毛刺。 而且,似乎"本地"搅拌机中的方向与" worldOrientation"相同。这也很烦人,因为我不再确定我在哪个参考框架中工作了。如果有人知道,请帮助!
编辑1: 显然,有一个内置的逻辑块可以为我处理这个问题,当我按下" 3D"它跟踪并成功旋转两个轴。虽然,我仍然想知道我的剧本的问题是什么! 3D按钮做了什么,我没有做过?
编辑2: 我试图停止制作三角技巧并发现当我使用本地方向时我总是在一个轴上获得万向节锁定。这可能是幕后发生的事情。感谢任何有兴趣的人,如果你有任何好的伎俩,我仍然很高兴听到=]!
答案 0 :(得分:0)
我有一个关于如何让相机查看特定对象的youtube教程。它可能有所帮助。 https://www.youtube.com/watch?v=hwbObDkiJrE
但是,当使用gui时,这个概念是打开object->关系面板,对于你想要做LookAt的对象,你可以使它成为你想要它跟随的对象的子对象(父对象) )。然后选择“顶点”作为关系。这将仅影响子对象的旋转角度。
试试这个,
bpy.data.objects['child'].parent = bpy.data.objects['parent']
bpy.data.objects['child'].parent_type = 'VERTEX'
实际上这里有更多信息 https://blender.stackexchange.com/questions/26108/how-do-i-parent-objects