mirror of https://github.com/qt/qt3d.git
qardboard: Fix QardboardCamera following viewMatrix changes
Bonus: also remove the binding loop on the matrix property that was being reported. Change-Id: I2489a1f7ac5f65b4061ce069796d5afeab1811de Reviewed-by: Mike Krus <mike.krus@kdab.com>
This commit is contained in:
parent
42a8d30929
commit
1d449ab502
|
|
@ -50,6 +50,7 @@
|
|||
|
||||
import Qt3D.Core 2.0
|
||||
import Qt3D.Render 2.0
|
||||
import Qardboard 1.0
|
||||
|
||||
Entity {
|
||||
id: root
|
||||
|
|
@ -63,12 +64,17 @@ Entity {
|
|||
property vector3d position: Qt.vector3d(0.0, 0.0, 0.0)
|
||||
property vector3d viewDirection: Qt.vector3d(0.0, 0.0, 1.0)
|
||||
property vector3d viewUp: Qt.vector3d(0.0, 1.0, 0.0)
|
||||
property alias viewMatrix: leftEyeTransform.matrix
|
||||
property alias viewMatrix: eyeTransform.matrix
|
||||
|
||||
readonly property real _fov2: Math.tan(fieldOfView * Math.PI / 180 * 0.5)
|
||||
readonly property real top: nearPlane * _fov2
|
||||
readonly property real a: aspectRatio * _fov2 * convergence
|
||||
|
||||
DeviceOrientation {
|
||||
id: orientation
|
||||
enabled: true
|
||||
}
|
||||
|
||||
CameraLens {
|
||||
id: leftEyeLens
|
||||
projectionType: CameraLens.FrustumProjection
|
||||
|
|
@ -92,33 +98,39 @@ Entity {
|
|||
}
|
||||
|
||||
Transform {
|
||||
id: leftEyeTransform
|
||||
id: eyeTransform
|
||||
|
||||
function computeMatrix(roll, pitch, yaw) {
|
||||
var n = Qt.matrix4x4()
|
||||
n.rotate(-roll, Qt.vector3d(1, 0, 0))
|
||||
n.rotate(yaw, Qt.vector3d(0, 1, 0))
|
||||
var vd = n.times(stereoCamera.viewDirection)
|
||||
var vu = n.times(stereoCamera.viewUp)
|
||||
var vc = stereoCamera.position.minus(vd)
|
||||
|
||||
matrix: {
|
||||
var m = Qt.matrix4x4();
|
||||
m.lookAt(root.position, root.position + root.viewDirection, root.viewUp);
|
||||
return m;
|
||||
m.translate(stereoCamera.position)
|
||||
var zAxis = stereoCamera.position.minus(vc).normalized()
|
||||
var xAxis = vu.crossProduct(zAxis).normalized();
|
||||
var yAxis = zAxis.crossProduct(xAxis);
|
||||
var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0,
|
||||
xAxis.y, yAxis.y, zAxis.y, 0,
|
||||
xAxis.z, yAxis.z, zAxis.z, 0,
|
||||
0, 0, 0, 1)
|
||||
return m.times(r);
|
||||
}
|
||||
|
||||
matrix: computeMatrix(orientation.roll, orientation.pitch, orientation.yaw)
|
||||
}
|
||||
|
||||
Transform {
|
||||
id: rightEyeTransform
|
||||
|
||||
matrix: leftEyeTransform.matrix
|
||||
}
|
||||
components: [ eyeTransform ]
|
||||
|
||||
property Entity leftCamera: Entity {
|
||||
components: [
|
||||
leftEyeLens,
|
||||
leftEyeTransform
|
||||
]
|
||||
components: [ leftEyeLens ]
|
||||
}
|
||||
|
||||
property Entity rightCamera: Entity {
|
||||
id: rightCameraEntity
|
||||
components: [
|
||||
rightEyeLens,
|
||||
rightEyeTransform
|
||||
]
|
||||
components: [ rightEyeLens ]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@
|
|||
import Qt3D.Core 2.0
|
||||
import Qt3D.Render 2.0
|
||||
import Qt3D.Input 2.0
|
||||
import Qardboard 1.0
|
||||
|
||||
Entity {
|
||||
id: root
|
||||
|
|
@ -75,31 +74,7 @@ Entity {
|
|||
}
|
||||
]
|
||||
|
||||
DeviceOrientation {
|
||||
id: orientation
|
||||
enabled: true
|
||||
}
|
||||
|
||||
QardboardCamera {
|
||||
id: stereoCamera
|
||||
viewMatrix: computeMatrix(orientation.roll, orientation.pitch, orientation.yaw)
|
||||
|
||||
property vector3d vc
|
||||
property vector3d vd
|
||||
property vector3d vu
|
||||
|
||||
function computeMatrix(roll, pitch, yaw) {
|
||||
var m = Qt.matrix4x4()
|
||||
m.rotate(-roll, Qt.vector3d(1, 0, 0))
|
||||
m.rotate(yaw, Qt.vector3d(0, 1, 0))
|
||||
vd = m.times(stereoCamera.viewDirection)
|
||||
vu = m.times(stereoCamera.viewUp)
|
||||
var r = Qt.matrix4x4()
|
||||
vc = stereoCamera.position.minus(vd)
|
||||
r.lookAt(stereoCamera.position, vc, vu)
|
||||
// console.log(roll.toFixed(2), pitch.toFixed(2), yaw.toFixed(2), stereoCamera.position, vd, vc, vu)
|
||||
// console.log(r)
|
||||
return r
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue