EditorCamera使用look_at后缩放异常及相机朝向定位问题求助
Ursina EditorCamera 初始朝向与缩放问题修复
问题1:设置初始朝向后缩放异常
我在Ursina引擎中使用EditorCamera,想设置初始朝向,但直接修改.rotation属性无效,于是改用look_at()方法。代码如下:
import ursina as ur app = ur.Ursina(title="Cube") ground = ur.Entity(model='quad', scale=60, texture='white_cube', texture_scale=(60, 60), rotation_x=90, y=-5, color=ur.color.light_gray) cube = ur.Entity(model='cube', color=ur.color.black, position=(0, 0, 0), scale=(3, 3, 3)) ur.camera.position = 3, 3, -5 ur.EditorCamera() ur.camera.look_at((1.5, 1.5, 1.5)) app.run()
这样能设置朝向,但鼠标滚轮缩放时,相机沿Z轴移动而非朝向方向,怎么修复?
问题2:无法实现预期的观察角度
根据@pokepetter的回答修改代码后,缩放恢复正常,但我想把相机放在立方体右侧、上方且稍靠前的位置,朝向立方体中心,以约45度角观察立方体右上顶角,却达不到预期效果。修改后的代码如下:
app = ur.Ursina(title="Cube") ground = ur.Entity(model='quad', scale=60, texture='white_cube', texture_scale=(60, 60), rotation_x=90, y=-5, color=ur.color.light_gray) cube = ur.Entity(model='cube', texture='brick', color=ur.color.red, position=(1.5, 1.5, 1.5), scale=(3, 3, 3)) camera = ur.EditorCamera() camera.position = 5, 5, -5 camera.look_at(cube) # camera.look_at(cube.position) # camera.look_at(ur.Vec3(1.5, 1.5, 1.5)) # camera.look_at(cube.bounds.center) app.run()
解决方案
修复缩放异常问题
直接操作全局的ur.camera调用look_at()会打乱EditorCamera的内部控制逻辑,因为EditorCamera是独立接管相机行为的组件。正确做法是先实例化EditorCamera并保存引用,再通过这个引用设置位置和朝向。
修改后的基础代码(解决缩放问题):
import ursina as ur app = ur.Ursina(title="Cube") ground = ur.Entity(model='quad', scale=60, texture='white_cube', texture_scale=(60, 60), rotation_x=90, y=-5, color=ur.color.light_gray) cube = ur.Entity(model='cube', color=ur.color.black, position=(0, 0, 0), scale=(3, 3, 3)) # 先实例化EditorCamera并获取引用 camera = ur.EditorCamera() # 通过引用设置位置和朝向 camera.position = 3, 3, -5 camera.look_at((1.5, 1.5, 1.5)) app.run()
实现预期观察角度
要实现从立方体右侧、上方、稍靠前的位置以45度角观察右上顶角,需要精准调整相机初始位置:
- 先明确立方体的关键坐标:立方体位置为
(1.5,1.5,1.5)、缩放3,所以右上顶角(X+、Y+、Z+方向)坐标是(3,3,3),中心坐标是(1.5,1.5,1.5)。 - 相机位置需要在顶角的右侧、上方、靠前区域,同时朝向中心。可以直接设置位置为
(6,6,0),这个位置能让相机以近似45度角对准中心和顶角。
调整后的代码:
import ursina as ur app = ur.Ursina(title="Cube") ground = ur.Entity(model='quad', scale=60, texture='white_cube', texture_scale=(60, 60), rotation_x=90, y=-5, color=ur.color.light_gray) cube = ur.Entity(model='cube', texture='brick', color=ur.color.red, position=(1.5, 1.5, 1.5), scale=(3, 3, 3)) camera = ur.EditorCamera() # 设置相机到立方体右侧、上方、靠前的位置 camera.position = 6, 6, 0 # 朝向立方体中心 camera.look_at(cube.position) app.run()
如果需要更精确的角度,可通过向量计算确定相机位置:
先定义目标方向的单位向量(比如X+、Y+、Z-方向,对应右侧、上方、靠前),乘以合适的距离后加到立方体中心坐标上:
import ursina as ur app = ur.Ursina(title="Cube") ground = ur.Entity(model='quad', scale=60, texture='white_cube', texture_scale=(60, 60), rotation_x=90, y=-5, color=ur.color.light_gray) cube = ur.Entity(model='cube', texture='brick', color=ur.color.red, position=(1.5, 1.5, 1.5), scale=(3, 3, 3)) camera = ur.EditorCamera() # 定义朝向目标的单位向量,X+、Y+、Z-方向 target_dir = ur.Vec3(1, 1, -1).normalized() # 设置相机位置:中心坐标 + 方向向量 * 距离 camera.position = cube.position + target_dir * 8 # 朝向立方体中心 camera.look_at(cube.position) app.run()
这样就能精准控制相机的观察角度和位置,满足需求。
内容的提问来源于stack exchange,提问作者Mate de Vita
相关产品推荐
相关产品推荐

