New answers tagged

0

The idea of measuring the distance between quaternions is indeed a useful similarity measure. In essence, what you can measure the dot product between two quaternions qA and qB just as you compute the dot product of two vectors (see this). Moreover, since you have unit quaternions (they do represent rotations!), the dot product should be between [-1,1]. ...


2

Alright so I figured out an even more ideal solution. The way I was trying to solve the problem was going to lead to more issues than I needed to deal with, so instead I slept on the problem and thought up a different approach. Instead of trying to min-max my orientation, I now calculate how far from the target orientation the camera is, If it lays above a ...


0

If I understand your question, you want to limit the rotational velocity of a turn? Get the delta. From your rotation delta, you can find out how many radians of turn it represents from the S element (or sometimes called W element). The S element is cos(rotationAmt / 2), so can be extracted as rotationAmt = acos(deltaQuaternion.s) * 2. From there you ...


2

I bit on the mathematical side, but here's a Q & A on MSE on computing quanternion distance. Using that you could do something like: quat targetQuat = target->getOrientation(); quat currentQuat = getOrientation(); quat lerpQuat = glm::lerp(currentQuat, targetQuat, 0.05f); quat maximumQuat = targetQuat*quat(0.707, 0, -0.3535, 0); float d1 = ...


1

Converting between a Quaternion (transform.rotation) and an Euler angle triplet is not possible the way you wrote it. See the API http://docs.unity3d.com/ScriptReference/Transform-rotation.html for the meaning of the transform.rotation property. If you want to double check or verify that your Euler angles are correct, you can convert them to a quaternion ...


1

My guess: At the bottom of MoveShip() you are setting the velocity to zero, if the player is at the boundary. As your code in Rotate() depends on the x and y components of the velocity (which is set to zero in the previous update, when at the boundary), the rotation will be set to Quaternion.Euler(0,0,0) in these occasions One way to solve this could be to ...


0

I have a MathHelper class for stuff like this (I've got a fast/inaccurate distance check, various radians-degrees conversions, this angle trig, safe angle addition, a snap method...). Here's the one that is of interest to you: public static double AngleBetweenPointsRadiansDouble(Vector2 P1, Vector2 P2) { return Math.Atan2( ( P2.y - P1.y ), ( P2.x - ...


0

After looking up how Reynolds seek steering works i realised that lerping wouldn't work. What you have to do is limit the steering to the maximum force which should be set very low to avoid instant steering. void FixedUpdate() { //move to position transform.Translate(Seek(new Vector3()) * Time.fixedDeltaTime); } Vector3 Seek(Vector3 target) { ...


2

Do not use boxes for this kind of terrain. There are numerous problems that arise with using boxes, namely "catching" of objects on the intersections between the boxes. Box2D provides Edge Shape (line) primitives as well as a Chain Shape that far better suites your purpose. From the linked manual: // This a chain shape with isolated vertices b2Vec2 vs[4]; ...


0

You can compute the angle with the arctangent function atan2 (from math.h) float angle = atan2(differenceY, differenceX);


0

Is your player's rotation always controlled by animation, and is there a rigidbody attached to the child object? If so, this would explain the discrepancy you are seeing. The values you see in the inspector will be after the animations are applied, while the values you get during Update will be from before. Do you get different values in your replay ...



Top 50 recent answers are included