The transform from the root frame to the view frame (4x4), from the frames' current positions and attitudes.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(View), | intent(in) | :: | self |
function world_to_view(self) result(m) class(View), intent(in) :: self real(wp) :: m(4,4) real(wp) :: f(4,4), rel(3), xy(3), r(3,3), len real(wp), parameter :: eps = 1.0e-6_wp m = identity_matrix() if (.not. associated(self%frame)) return f = frame_to_root(self, self%frame) if (self%frame_type == ABSOLUTE_FRAME) then m = translation_matrix(-f(1:3, 4)) else m = rigid_inverse(f) end if if (.not. associated(self%lookat)) return ! the look-at frame's origin in the view frame, turned onto +y f = frame_to_root(self, self%lookat) rel = matmul(m(1:3, 1:3), f(1:3, 4)) + m(1:3, 4) if (norm2(rel) <= eps) return if (self%rotation_type == VIEW_DIRECT) then m = rotated(quat_to_matrix(quat_from_vectors(rel, [0.0_wp, 1.0_wp, 0.0_wp])), m) else xy = [rel(1), rel(2), 0.0_wp] len = norm2(xy) if (len > eps) m = rotated(quat_to_matrix(quat_from_vectors(xy, [0.0_wp, 1.0_wp, 0.0_wp])), m) r = quat_to_matrix(quat_from_vectors([0.0_wp, len, rel(3)], [0.0_wp, 1.0_wp, 0.0_wp])) m = rotated(r, m) end if end function world_to_view