def update(self, dt): self.t += dt if self.alive: self.helm.update(dt) self.sail.update(dt) self.update_masts(self.sail.current) # damp roll self.roll *= pow(0.6, dt) # Compute some bobbing motion rollmoment = 0.05 * sin(self.t) pitch = 0.02 * sin(0.31 * self.t) # Compute the forward vector from the curent heading q = self.get_quaternion() forward = q * Vector3(0, 0, 1) angular_velocity = self.helm.current * min(forward.dot(self.vel), 2) * 0.03 angle_to_wind = map_angle(self.world.wind_angle - self.angle) sail_power = get_sail_power(angle_to_wind) heeling_moment = get_heeling_moment(angle_to_wind) rollmoment += angular_velocity * 0.5 # lean over from centrifugal force of turn rollmoment -= heeling_moment * 0.05 * self.sail.current # heel from wind force # Update ship angle and position self.angle = map_angle(self.angle + angular_velocity * dt) accel = forward * self.sail.current * sail_power * 0.5 * dt self.vel += accel self.vel *= pow(0.7, dt) # Drag self.pos += self.vel * dt # Float if self.alive: self.pos += Vector3(0, -0.5, 0) * self.pos.y * dt else: self.pos += Vector3(0, -1, 0) * dt self.roll += rollmoment * dt # Apply ship angle and position to model self.rot = ( q * Quaternion.new_rotate_axis(pitch, Vector3(1, 0, 0)) * Quaternion.new_rotate_axis(self.roll, Vector3(0, 0, 1)) ) rotangle, (rotx, roty, rotz) = self.rot.get_angle_axis() self.model.rotation = (degrees(rotangle), rotx, roty, rotz) self.model.pos = self.pos # Adjust sail angle to wind direction if self.alive: sail_angle = get_sail_setting(angle_to_wind) for sail in self.model.nodes[1:]: sail.rotation = degrees(sail_angle), 0, 1, 0
from euclid import Quaternion, Vector3 import glob import math import os import socket QUART_PI=0.25*math.pi HALF_PI=0.5*math.pi PI2=2*math.pi X_UNIT=Vector3(1.0, 0.0, 0.0) Y_UNIT=Vector3(0.0, 1.0, 0.0) NEG_Y_UNIT=-Y_UNIT Z_UNIT=Vector3(0.0, 0.0, 1.0) NULL_VEC=Vector3(0.0,0.0,0.0) NULL_ROT=Quaternion.new_rotate_axis(0.0, Y_UNIT) def testAllAngleForXY(): testAngleForXY(57735, 100000, 1.0/6) testAngleForXY(1732, 1000, 1.0/3) testAngleForXY(1732, -1000, 4.0/6) testAngleForXY(57735, -100000, 5.0/6) testAngleForXY(0,1,2.0) testAngleForXY(1,0,1.0/2) testAngleForXY(0,-1,1.0) testAngleForXY(-57735, -100000, 7.0/6) testAngleForXY(-1732, -1000, 4.0/3) testAngleForXY(-1732, 1000, 5.0/3) testAngleForXY(-57735, 100000, 11.0/6) testAngleForXY(-1,0,3.0/2)
def get_quaternion(self): """Get the Quarternion of the ship's current heading.""" return Quaternion.new_rotate_axis(self.angle, Vector3(0, 1, 0))
from euclid import Quaternion, Vector3 import glob import math import os import socket QUART_PI = 0.25 * math.pi HALF_PI = 0.5 * math.pi PI2 = 2 * math.pi X_UNIT = Vector3(1.0, 0.0, 0.0) Y_UNIT = Vector3(0.0, 1.0, 0.0) NEG_Y_UNIT = -Y_UNIT Z_UNIT = Vector3(0.0, 0.0, 1.0) NULL_VEC = Vector3(0.0, 0.0, 0.0) NULL_ROT = Quaternion.new_rotate_axis(0.0, Y_UNIT) def testAllAngleForXY(): testAngleForXY(57735, 100000, 1.0 / 6) testAngleForXY(1732, 1000, 1.0 / 3) testAngleForXY(1732, -1000, 4.0 / 6) testAngleForXY(57735, -100000, 5.0 / 6) testAngleForXY(0, 1, 2.0) testAngleForXY(1, 0, 1.0 / 2) testAngleForXY(0, -1, 1.0) testAngleForXY(-57735, -100000, 7.0 / 6) testAngleForXY(-1732, -1000, 4.0 / 3) testAngleForXY(-1732, 1000, 5.0 / 3) testAngleForXY(-57735, 100000, 11.0 / 6) testAngleForXY(-1, 0, 3.0 / 2)