Change glTF loading behavior so that cameras face the right way
This commit is contained in:
parent
33bed5dd70
commit
476a3e0693
@ -1,11 +1,11 @@
|
|||||||
use core::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
use bevy_math::{Mat4, Quat, Vec3};
|
use bevy_math::{Mat4, Quat, Vec3};
|
||||||
use bevy_transform::components::Transform;
|
use bevy_transform::components::Transform;
|
||||||
|
|
||||||
pub(crate) trait ConvertCoordinates {
|
pub(crate) trait ConvertCoordinates {
|
||||||
/// Converts the glTF coordinates to Bevy's coordinate system.
|
/// Converts the glTF model coordinates to Bevy's coordinate system.
|
||||||
/// - glTF:
|
/// - glTF (models):
|
||||||
/// - forward: Z
|
/// - forward: Z
|
||||||
/// - up: Y
|
/// - up: Y
|
||||||
/// - right: -X
|
/// - right: -X
|
||||||
@ -18,16 +18,6 @@ pub(crate) trait ConvertCoordinates {
|
|||||||
fn convert_coordinates(self) -> Self;
|
fn convert_coordinates(self) -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) trait ConvertCameraCoordinates {
|
|
||||||
/// Like `convert_coordinates`, but uses the following for the lens rotation:
|
|
||||||
/// - forward: -Z
|
|
||||||
/// - up: Y
|
|
||||||
/// - right: X
|
|
||||||
///
|
|
||||||
/// See <https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#view-matrix>
|
|
||||||
fn convert_camera_coordinates(self) -> Self;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConvertCoordinates for Vec3 {
|
impl ConvertCoordinates for Vec3 {
|
||||||
fn convert_coordinates(self) -> Self {
|
fn convert_coordinates(self) -> Self {
|
||||||
Vec3::new(-self.x, self.y, -self.z)
|
Vec3::new(-self.x, self.y, -self.z)
|
||||||
@ -66,15 +56,7 @@ impl ConvertCoordinates for Mat4 {
|
|||||||
impl ConvertCoordinates for Transform {
|
impl ConvertCoordinates for Transform {
|
||||||
fn convert_coordinates(mut self) -> Self {
|
fn convert_coordinates(mut self) -> Self {
|
||||||
self.translation = self.translation.convert_coordinates();
|
self.translation = self.translation.convert_coordinates();
|
||||||
self.rotation = self.rotation.convert_coordinates();
|
self.rotation *= Quat::from_rotation_y(PI);
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConvertCameraCoordinates for Transform {
|
|
||||||
fn convert_camera_coordinates(mut self) -> Self {
|
|
||||||
self.translation = self.translation.convert_coordinates();
|
|
||||||
self.rotate_y(PI);
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,10 +10,7 @@ use itertools::Itertools;
|
|||||||
#[cfg(feature = "bevy_animation")]
|
#[cfg(feature = "bevy_animation")]
|
||||||
use bevy_platform::collections::{HashMap, HashSet};
|
use bevy_platform::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
use crate::{
|
use crate::{convert_coordinates::ConvertCoordinates as _, GltfError};
|
||||||
convert_coordinates::{ConvertCameraCoordinates as _, ConvertCoordinates as _},
|
|
||||||
GltfError,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) fn node_name(node: &Node) -> Name {
|
pub(crate) fn node_name(node: &Node) -> Name {
|
||||||
let name = node
|
let name = node
|
||||||
@ -44,12 +41,8 @@ pub(crate) fn node_transform(node: &Node, convert_coordinates: bool) -> Transfor
|
|||||||
scale: Vec3::from(scale),
|
scale: Vec3::from(scale),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if convert_coordinates {
|
if convert_coordinates && node.camera().is_none() && node.light().is_none() {
|
||||||
if node.camera().is_some() {
|
transform.convert_coordinates()
|
||||||
transform.convert_camera_coordinates()
|
|
||||||
} else {
|
|
||||||
transform.convert_coordinates()
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
transform
|
transform
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user