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:
Paul Lemire 2018-01-24 15:09:45 +01:00
parent 42a8d30929
commit 1d449ab502
2 changed files with 30 additions and 43 deletions

View File

@ -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 ]
}
}

View File

@ -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
}
}
}