def Torus(mNumSegSection=64, mNumSegCircle=64, mRadius=1.0,
          mSectionRadius=0.2):
    (gvw, prim, geom, path) = empty('t')

    deltaSection = (pi * 2 / mNumSegSection)
    deltaCircle = (pi * 2 / mNumSegCircle)

    offset = 0

    for i in range(0, mNumSegCircle + 1):
        for j in range(0, mNumSegSection + 1):
            v0 = Vec3(mRadius + mSectionRadius * cos(j * deltaSection),
                      mSectionRadius * sin(j * deltaSection), 0.0)
            q = Quat()
            q.setFromAxisAngleRad(i * deltaCircle, Vec3(0, 1, 0))
            v = q.xform(v0)

            gvw.addData3f(v)

            if i != mNumSegCircle:
                prim.addVertices(offset + mNumSegSection + 1, offset,
                                 offset + mNumSegSection)
                prim.addVertices(offset + mNumSegSection + 1, offset + 1,
                                 offset)
            offset += 1

    prim.closePrimitive()
    geom.addPrimitive(prim)

    return path
示例#2
0
 def setTextureRotation(self, angle):
     # Rotate texture around the face normal
     rads = deg2Rad(self.rotation - angle)
     # Rotate around the face normal
     texNorm = self.vAxis.cross(self.uAxis).normalized()
     transform = Quat()
     transform.setFromAxisAngleRad(rads, texNorm)
     self.uAxis = transform.xform(self.uAxis)
     self.vAxis = transform.xform(self.vAxis)
     self.rotation = angle
示例#3
0
    def loadModels(self):
        self.limbModel = loader.loadModel("models/limb/limb.bam")

        hw = 10.0
        hh = 20.0

        height = 27.0

        legStarts = [
            Vec3(hw, hh, height),
            Vec3(-hw, hh, height),
            Vec3(hw, -hh, height),
            Vec3(-hw, -hh, height)
        ]

        self.limbs = []

        self.angles = 12 * [0.0]
        self.rest_rots = []

        for i in range(4):
            femur = copy(self.limbModel)
            femur.setPos(legStarts[i])
            femur.reparentTo(render)

            self.limbs.append(femur)

            q = Quat()
            q.setFromAxisAngleRad(np.pi * 0.75, Vec3(1.0, 0.0, 0.0))

            self.rest_rots.append(q)

            tibia = copy(self.limbModel)
            tibia.setPos(Vec3(0.0, 0.0, 24.0))
            tibia.reparentTo(femur)

            self.limbs.append(tibia)

            q = Quat()
            q.setFromAxisAngleRad(np.pi * 0.5, Vec3(1.0, 0.0, 0.0))

            self.rest_rots.append(q)

        self.floorModel = loader.loadModel("models/floor/floor.bam")
        self.floorModel.reparentTo(render)
示例#4
0
    def mainLoop(self, task):
        camera.setPos(Vec3(-150.0, 150.0, 100.0))
        camera.lookAt(Vec3(0.0, 0.0, 10.0))

        ANGLE_RES = self.h.getInputSize(0).z

        self.h.step(self.cs, [self.h.getPredictionCs(0)], False, 1.0)

        for i in range(12):
            target_angle = (self.h.getPredictionCs(0)[i] /
                            float(ANGLE_RES - 1) * 2.0 - 1.0) * (0.3 * np.pi)

            self.angles[i] += 0.1 * (target_angle - self.angles[i])

        # Adjust angles
        for i in range(4):
            q1 = Quat()
            q1.setFromAxisAngleRad(self.angles[0 * 4 + i], Vec3(0.0, 1.0, 0.0))

            q2 = Quat()
            q2.setFromAxisAngleRad(-self.angles[1 * 4 + i],
                                   Vec3(1.0, 0.0, 0.0))

            self.limbs[i * 2 + 0].setQuat(self.rest_rots[i * 2 + 0] * q1 * q2)

            q1 = Quat()
            q1.setFromAxisAngleRad(-self.angles[2 * 4 + i],
                                   Vec3(1.0, 0.0, 0.0))

            self.limbs[i * 2 + 1].setQuat(self.rest_rots[i * 2 + 1] * q1)

        return task.cont
def getRotationTo(src, dest, fallbackAxis=Vec3_ZERO):
    # Quaternion q;
    # Vector3 v0 = *this;
    # Vector3 v1 = dest;
    # v0.normalise();
    # v1.normalise();
    q = Quat()
    v0 = Vec3(src)
    v1 = Vec3(dest)
    v0.normalize()
    v1.normalize()

    # Real d = v0.dotProduct(v1);
    d = v0.dot(v1)

    # if (d >= 1.0f)
    # {
    # return Quaternion::IDENTITY;
    # }
    if d >= 1.0:
        return Quat(1, 0, 0, 0)

    # if (d < (1e-6f - 1.0f))
    if d < (1.0e-6 - 1.0):
        # if (fallbackAxis != Vector3::ZERO)
        # {
        # // rotate 180 degrees about the fallback axis
        # q.FromAngleAxis(Radian(Math::PI), fallbackAxis);
        # }
        if fallbackAxis != Vec3_ZERO:
            q.setFromAxisAngleRad(pi, fallbackAxis)
        # else
        # {
        # // Generate an axis
        # Vector3 axis = Vector3::UNIT_X.crossProduct(*this);
        # if (axis.isZeroLength()) // pick another if colinear
        # axis = Vector3::UNIT_Y.crossProduct(*this);
        # axis.normalise();
        # q.FromAngleAxis(Radian(Math::PI), axis);
        # }
        else:
            axis = Vec3(1, 0, 0).cross(src)
            if axis.almostEqual(Vec3.zero()):
                axis = Vec3(0, 1, 0).cross(src)
            axis.normalize()
            q.setFromAxisAngleRad(pi, axis)
        # else
        # {
        # Real s = Math::Sqrt( (1+d)*2 );
        # Real invs = 1 / s;

        # Vector3 c = v0.crossProduct(v1);

        # q.x = c.x * invs;
        # q.y = c.y * invs;
        # q.z = c.z * invs;
        # q.w = s * 0.5f;
        # q.normalise();
    # }
    else:
        s = sqrt((1 + d) * 2)
        invs = 1 / s
        c = v0.cross(v1)
        q.setI(c.x * invs)
        q.setJ(c.y * invs)
        q.setK(c.z * invs)
        q.setR(s * .5)
        q.normalize()
    return q