mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Use actual floor origin for local-floor
This commit is contained in:
parent
322463450d
commit
bc1bd22d47
2 changed files with 18 additions and 17 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -6391,7 +6391,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webxr"
|
name = "webxr"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
source = "git+https://github.com/servo/webxr#a098d39811ad73a070b578d62606aef169aef8e9"
|
source = "git+https://github.com/servo/webxr#48ce33668b2e6cd95507ee909ac02c160ae7bedc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen",
|
"bindgen",
|
||||||
"euclid",
|
"euclid",
|
||||||
|
@ -6412,7 +6412,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webxr-api"
|
name = "webxr-api"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
source = "git+https://github.com/servo/webxr#a098d39811ad73a070b578d62606aef169aef8e9"
|
source = "git+https://github.com/servo/webxr#48ce33668b2e6cd95507ee909ac02c160ae7bedc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"euclid",
|
"euclid",
|
||||||
"ipc-channel",
|
"ipc-channel",
|
||||||
|
|
|
@ -10,10 +10,10 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
|
||||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::xrrigidtransform::XRRigidTransform;
|
use crate::dom::xrrigidtransform::XRRigidTransform;
|
||||||
use crate::dom::xrsession::{cast_transform, ApiPose, ApiRigidTransform, ApiViewerPose, XRSession};
|
use crate::dom::xrsession::{cast_transform, ApiPose, ApiViewerPose, XRSession};
|
||||||
use crate::dom::xrspace::XRSpace;
|
use crate::dom::xrspace::XRSpace;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use euclid::{RigidTransform3D, Vector3D};
|
use euclid::RigidTransform3D;
|
||||||
use webxr_api::Frame;
|
use webxr_api::Frame;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -96,7 +96,6 @@ impl XRReferenceSpace {
|
||||||
///
|
///
|
||||||
/// Does not apply originOffset, use get_viewer_pose instead if you need it
|
/// Does not apply originOffset, use get_viewer_pose instead if you need it
|
||||||
pub fn get_unoffset_viewer_pose(&self, base_pose: &Frame) -> Option<ApiViewerPose> {
|
pub fn get_unoffset_viewer_pose(&self, base_pose: &Frame) -> Option<ApiViewerPose> {
|
||||||
let viewer_pose: ApiViewerPose = cast_transform(base_pose.transform?);
|
|
||||||
// all math is in column-vector notation
|
// all math is in column-vector notation
|
||||||
// we use the following equation to verify correctness here:
|
// we use the following equation to verify correctness here:
|
||||||
// get_viewer_pose(space) = get_pose(space).inverse() * get_pose(viewer_space)
|
// get_viewer_pose(space) = get_pose(space).inverse() * get_pose(viewer_space)
|
||||||
|
@ -105,20 +104,22 @@ impl XRReferenceSpace {
|
||||||
// get_viewer_pose(eye_level) = get_pose(eye_level).inverse() * get_pose(viewer_space)
|
// get_viewer_pose(eye_level) = get_pose(eye_level).inverse() * get_pose(viewer_space)
|
||||||
// = I * viewer_pose
|
// = I * viewer_pose
|
||||||
// = viewer_pose
|
// = viewer_pose
|
||||||
|
let viewer_pose: ApiViewerPose = cast_transform(base_pose.transform?);
|
||||||
|
|
||||||
// we get viewer poses in eye-level space by default
|
// we get viewer poses in eye-level space by default
|
||||||
Some(viewer_pose)
|
Some(viewer_pose)
|
||||||
},
|
},
|
||||||
XRReferenceSpaceType::Local_floor => {
|
XRReferenceSpaceType::Local_floor => {
|
||||||
// XXXManishearth support getting floor info from stage parameters
|
|
||||||
|
|
||||||
// get_viewer_pose(floor_level) = get_pose(floor_level).inverse() * get_pose(viewer_space)
|
// get_viewer_pose(floor_level) = get_pose(floor_level).inverse() * get_pose(viewer_space)
|
||||||
// = Translate(-2).inverse() * viewer_pose
|
// = floor_to_native.inverse() * viewer_pose
|
||||||
// = Translate(2) * viewer_pose
|
// = native_to_floor * viewer_pose
|
||||||
|
let viewer_pose = base_pose.transform?;
|
||||||
|
let native_to_floor = self
|
||||||
|
.upcast::<XRSpace>()
|
||||||
|
.session()
|
||||||
|
.with_session(|s| s.floor_transform())?;
|
||||||
|
|
||||||
// assume approximate user height of 2 meters
|
Some(cast_transform(native_to_floor.pre_transform(&viewer_pose)))
|
||||||
let floor_to_eye: ApiRigidTransform = Vector3D::new(0., 2., 0.).into();
|
|
||||||
Some(floor_to_eye.pre_transform(&viewer_pose))
|
|
||||||
},
|
},
|
||||||
XRReferenceSpaceType::Viewer => {
|
XRReferenceSpaceType::Viewer => {
|
||||||
// This reference space follows the viewer around, so the viewer is
|
// This reference space follows the viewer around, so the viewer is
|
||||||
|
@ -155,11 +156,11 @@ impl XRReferenceSpace {
|
||||||
Some(RigidTransform3D::identity())
|
Some(RigidTransform3D::identity())
|
||||||
},
|
},
|
||||||
XRReferenceSpaceType::Local_floor => {
|
XRReferenceSpaceType::Local_floor => {
|
||||||
// XXXManishearth support getting floor info from stage parameters
|
let native_to_floor = self
|
||||||
|
.upcast::<XRSpace>()
|
||||||
// Assume approximate height of 2m
|
.session()
|
||||||
// the floor-level space is 2m below the eye-level space, which is (0, 0, 0)
|
.with_session(|s| s.floor_transform())?;
|
||||||
Some(Vector3D::new(0., -2., 0.).into())
|
Some(cast_transform(native_to_floor.inverse()))
|
||||||
},
|
},
|
||||||
XRReferenceSpaceType::Viewer => base_pose.transform.map(cast_transform),
|
XRReferenceSpaceType::Viewer => base_pose.transform.map(cast_transform),
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue