0

私はちょっとしたサイドプロジェクトに取り組んでおり、Object3Dポジショニングを使用してThreeJSでステアリングアルゴリズムをうまく機能させるのに少し苦労しています。私が現在抱えている主な問題は、角速度がかなり制御されておらず、すべてがあまりにも速く回転することです。これを少し制限できるようにしたいと思います。コードの簡略化された例を提供します。私はもうすぐそこにいると思います。クォータニオンとMatrix4を少し調べましたが、理解できませんでした。誰かが以前にこの問題を抱えていましたか?ありがとう!

class Movement extends THREE.Object3D
    constructor: ->
        super
        @velocity = new THREE.Vector3()
        @speed = 4
        @ease = 7
        @hault = 2

    steer: (mode, target) ->
        if @speed is 0
            @velocity.set 0, 0, 0
            return true

        # velocity vector
        switch mode
            when 'arrive'
                fromPosition = @position
                toPosition = target
            when 'flee'
                fromPosition = target
                toPosition = @position
        @velocity.sub toPosition, fromPosition

        # calculate magnitude
        magnitude = @velocity.length()

        # hault
        if magnitude < @hault
            return true

        # limit angle of rotation
        # angle = Math.acos fromPosition.dot(toPosition) / fromPosition.length() / toPosition.length()
        # axis = new THREE.Vector3().cross fromPosition, toPosition .normalize()

        # speed limit
        if magnitude > @speed
            @velocity.divideScalar magnitude / @speed

        # easing
        if magnitude < @ease and mode is 'arrive'
            @velocity.multiplyScalar magnitude / (@ease + @hault / 2)

        # adjust for time
        @velocity.multiplyScalar GLOBAL.clock.getDelta()

        # update position and rotation
        @position.addSelf @velocity
        @rotation.y = Math.atan2 -@velocity.z, @velocity.x
        @rotation.z = Math.asin @velocity.y / @velocity.length()
4

1 に答える 1

1

これを試して変更してください:

var qstart = new THREE.Quaternion();
    var qend = new THREE.Quaternion();
    var m  = new THREE.Matrix4();

    qstart.setFromRotationMatrix( MOVING_OBJECT.matrixWorld );
    qend.setFromRotationMatrix( m.lookAt( TARGET.position, MOVING_OBJECT.position, new THREE.Vector3( 0, 1, 0 ) ) );  

    MOVING_OBJECT.rotation.setEulerFromQuaternion( qstart.slerpSelf(qend, 0.015 ) ); 
于 2012-10-09T13:00:39.557 に答える