示例#1
0
    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
示例#2
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)
示例#3
0
 def get_quaternion(self):
     """Get the Quarternion of the ship's current heading."""
     return Quaternion.new_rotate_axis(self.angle, Vector3(0, 1, 0))
示例#4
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)