def move_along_view(self, camera, distance):
     px, py, pz = gh_camera.get_position(camera._id)
     vx, vy, vz = gh_camera.get_view_vector(camera._id)
     px = px + (vx * distance)
     py = py + (vy * distance)
     pz = pz + (vz * distance)
     gh_camera.set_position(camera._id, px, py, pz)
 def ComputeProjectiveScaleFactor(self, camera, lookat_x, lookat_y,
                                  lookat_z, screen_height, fov):
     fov_rad = fov * math.pi / 180.0
     focalLength = (0.5 * screen_height) / (math.tan(fov_rad / 2))
     px, py, pz = gh_camera.get_position(camera._id)
     dx = lookat_x - px
     dy = lookat_y - py
     dz = lookat_z - pz
     pivotDistance = math.sqrt((dx * dx) + (dy * dy) + (dz * dz))
     S = pivotDistance / focalLength
     return S
    def strafe_h_xz(self, camera, dist, update_lookat):
        v = vec3()
        u = vec3()
        v.x, v.y, v.z = gh_camera.get_view_vector(camera._id)
        v.neg()
        u.x, u.y, u.z = gh_camera.get_up_vector(camera._id)
        xvec = v.cross(u)
        p = vec3()
        p.x, p.y, p.z = gh_camera.get_position(camera._id)
        p.x = p.x + (xvec.x * dist)
        p.z = p.z + (xvec.z * dist)
        gh_camera.set_position(camera._id, p.x, p.y, p.z)

        if (update_lookat == 1):
            lookat_x = camera._lookat_x + (xvec.x * dist)
            lookat_y = camera._lookat_y + (xvec.y * dist)
            lookat_z = camera._lookat_z + (xvec.z * dist)
            self.set_orbit_lookat(camera, lookat_x, lookat_y, lookat_z)