私はちょっとしたサイドプロジェクトに取り組んでおり、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()