Rotate object around a fixed coordinate axis
$begingroup$
I am trying to let the user of my app rotate a 3D object drawn in the center of the screen by dragging their finger on screen. A horizontal movement on screen means rotation around a fixed Y axis, and a vertical movement means rotation around the X axis. The problem I am having is that if I just allow rotation around one axis the object rotates fine, but as soon as I introduce a second rotation the object doesn't rotate as expected.
Here is a picture of what is happening:
The blue axis represents my fixed axis. Picture the screen having this fixed blue axis. This is what I want the object to rotate in relation to. What is happening is in red.
Here's what I know:
The first rotation around Y (0, 1, 0) causes the model to move from the blue space (call this space A) into another space (call this space B)
Trying to rotate again using the vector (1, 0, 0) rotates around the x axis in space B NOT in space A which is not what I mean to do.
Here's what I tried to fix this, given what I (think) I know (leaving out the W coord for brevity):
- First rotate around Y (0, 1, 0) using a Quaternion.
- Convert the rotation Y Quaternion to a Matrix.
- Multiply the inverse of the Y rotation matrix by my fixed axis x Vector (1, 0, 0) to get the fixed X axis in relation to the new space.
- Rotate around this new X Vector using a Quaternion.
This isn't working how I expect. The rotation seems to work, but at some point horizontal movement doesn't rotate about the Y axis, it appears to rotate about the Z axis.
I'm not sure if my understanding is wrong, or if something else is causing a problem. I have some other transformations I'm doing to the object besides rotation. I move the object to the center before applying rotation. I rotate it using the matrix returned from my function above, then I translate it -2 in the Z direction so I can see the object.
linear-algebra 3d rotations
$endgroup$
|
show 5 more comments
$begingroup$
I am trying to let the user of my app rotate a 3D object drawn in the center of the screen by dragging their finger on screen. A horizontal movement on screen means rotation around a fixed Y axis, and a vertical movement means rotation around the X axis. The problem I am having is that if I just allow rotation around one axis the object rotates fine, but as soon as I introduce a second rotation the object doesn't rotate as expected.
Here is a picture of what is happening:
The blue axis represents my fixed axis. Picture the screen having this fixed blue axis. This is what I want the object to rotate in relation to. What is happening is in red.
Here's what I know:
The first rotation around Y (0, 1, 0) causes the model to move from the blue space (call this space A) into another space (call this space B)
Trying to rotate again using the vector (1, 0, 0) rotates around the x axis in space B NOT in space A which is not what I mean to do.
Here's what I tried to fix this, given what I (think) I know (leaving out the W coord for brevity):
- First rotate around Y (0, 1, 0) using a Quaternion.
- Convert the rotation Y Quaternion to a Matrix.
- Multiply the inverse of the Y rotation matrix by my fixed axis x Vector (1, 0, 0) to get the fixed X axis in relation to the new space.
- Rotate around this new X Vector using a Quaternion.
This isn't working how I expect. The rotation seems to work, but at some point horizontal movement doesn't rotate about the Y axis, it appears to rotate about the Z axis.
I'm not sure if my understanding is wrong, or if something else is causing a problem. I have some other transformations I'm doing to the object besides rotation. I move the object to the center before applying rotation. I rotate it using the matrix returned from my function above, then I translate it -2 in the Z direction so I can see the object.
linear-algebra 3d rotations
$endgroup$
$begingroup$
Can you be more specific about how you approach the problem? What exactly are you using?
$endgroup$
– Olivier
Mar 13 '15 at 19:14
$begingroup$
@Olivier I posted a more detailed version of the question here
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:18
$begingroup$
Has it not been answered?
$endgroup$
– Olivier
Mar 13 '15 at 19:19
$begingroup$
Nope. I've asked on Reddit, Unity Answers, Game Dev stack, and here. No answer, at least not an acceptable one that actually answers my question.
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:20
1
$begingroup$
Your nice animation shows 3 rotations, with 9 vectors. Which are X and Y? You should be able to just keep multiplying the object's current quaternion by the new finger-swipe quaternion, and it should work. The problem is unlikely to be in your other transformations. It looks like using a quaternion for step 1 is a waste of time since you could directly get the result of step 2 with a sin and cos. Then steps 3 and 4 seem to be the source of your problem -- rotating around the rotated X axis (red) is exactly what you don't like. Just rotate around the standard X axis (blue).
$endgroup$
– Matt
Mar 18 '15 at 1:08
|
show 5 more comments
$begingroup$
I am trying to let the user of my app rotate a 3D object drawn in the center of the screen by dragging their finger on screen. A horizontal movement on screen means rotation around a fixed Y axis, and a vertical movement means rotation around the X axis. The problem I am having is that if I just allow rotation around one axis the object rotates fine, but as soon as I introduce a second rotation the object doesn't rotate as expected.
Here is a picture of what is happening:
The blue axis represents my fixed axis. Picture the screen having this fixed blue axis. This is what I want the object to rotate in relation to. What is happening is in red.
Here's what I know:
The first rotation around Y (0, 1, 0) causes the model to move from the blue space (call this space A) into another space (call this space B)
Trying to rotate again using the vector (1, 0, 0) rotates around the x axis in space B NOT in space A which is not what I mean to do.
Here's what I tried to fix this, given what I (think) I know (leaving out the W coord for brevity):
- First rotate around Y (0, 1, 0) using a Quaternion.
- Convert the rotation Y Quaternion to a Matrix.
- Multiply the inverse of the Y rotation matrix by my fixed axis x Vector (1, 0, 0) to get the fixed X axis in relation to the new space.
- Rotate around this new X Vector using a Quaternion.
This isn't working how I expect. The rotation seems to work, but at some point horizontal movement doesn't rotate about the Y axis, it appears to rotate about the Z axis.
I'm not sure if my understanding is wrong, or if something else is causing a problem. I have some other transformations I'm doing to the object besides rotation. I move the object to the center before applying rotation. I rotate it using the matrix returned from my function above, then I translate it -2 in the Z direction so I can see the object.
linear-algebra 3d rotations
$endgroup$
I am trying to let the user of my app rotate a 3D object drawn in the center of the screen by dragging their finger on screen. A horizontal movement on screen means rotation around a fixed Y axis, and a vertical movement means rotation around the X axis. The problem I am having is that if I just allow rotation around one axis the object rotates fine, but as soon as I introduce a second rotation the object doesn't rotate as expected.
Here is a picture of what is happening:
The blue axis represents my fixed axis. Picture the screen having this fixed blue axis. This is what I want the object to rotate in relation to. What is happening is in red.
Here's what I know:
The first rotation around Y (0, 1, 0) causes the model to move from the blue space (call this space A) into another space (call this space B)
Trying to rotate again using the vector (1, 0, 0) rotates around the x axis in space B NOT in space A which is not what I mean to do.
Here's what I tried to fix this, given what I (think) I know (leaving out the W coord for brevity):
- First rotate around Y (0, 1, 0) using a Quaternion.
- Convert the rotation Y Quaternion to a Matrix.
- Multiply the inverse of the Y rotation matrix by my fixed axis x Vector (1, 0, 0) to get the fixed X axis in relation to the new space.
- Rotate around this new X Vector using a Quaternion.
This isn't working how I expect. The rotation seems to work, but at some point horizontal movement doesn't rotate about the Y axis, it appears to rotate about the Z axis.
I'm not sure if my understanding is wrong, or if something else is causing a problem. I have some other transformations I'm doing to the object besides rotation. I move the object to the center before applying rotation. I rotate it using the matrix returned from my function above, then I translate it -2 in the Z direction so I can see the object.
linear-algebra 3d rotations
linear-algebra 3d rotations
edited Mar 18 '15 at 7:40
Daniel Fischer♦
173k16163285
173k16163285
asked Mar 6 '15 at 18:06
Christopher PerryChristopher Perry
7610
7610
$begingroup$
Can you be more specific about how you approach the problem? What exactly are you using?
$endgroup$
– Olivier
Mar 13 '15 at 19:14
$begingroup$
@Olivier I posted a more detailed version of the question here
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:18
$begingroup$
Has it not been answered?
$endgroup$
– Olivier
Mar 13 '15 at 19:19
$begingroup$
Nope. I've asked on Reddit, Unity Answers, Game Dev stack, and here. No answer, at least not an acceptable one that actually answers my question.
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:20
1
$begingroup$
Your nice animation shows 3 rotations, with 9 vectors. Which are X and Y? You should be able to just keep multiplying the object's current quaternion by the new finger-swipe quaternion, and it should work. The problem is unlikely to be in your other transformations. It looks like using a quaternion for step 1 is a waste of time since you could directly get the result of step 2 with a sin and cos. Then steps 3 and 4 seem to be the source of your problem -- rotating around the rotated X axis (red) is exactly what you don't like. Just rotate around the standard X axis (blue).
$endgroup$
– Matt
Mar 18 '15 at 1:08
|
show 5 more comments
$begingroup$
Can you be more specific about how you approach the problem? What exactly are you using?
$endgroup$
– Olivier
Mar 13 '15 at 19:14
$begingroup$
@Olivier I posted a more detailed version of the question here
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:18
$begingroup$
Has it not been answered?
$endgroup$
– Olivier
Mar 13 '15 at 19:19
$begingroup$
Nope. I've asked on Reddit, Unity Answers, Game Dev stack, and here. No answer, at least not an acceptable one that actually answers my question.
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:20
1
$begingroup$
Your nice animation shows 3 rotations, with 9 vectors. Which are X and Y? You should be able to just keep multiplying the object's current quaternion by the new finger-swipe quaternion, and it should work. The problem is unlikely to be in your other transformations. It looks like using a quaternion for step 1 is a waste of time since you could directly get the result of step 2 with a sin and cos. Then steps 3 and 4 seem to be the source of your problem -- rotating around the rotated X axis (red) is exactly what you don't like. Just rotate around the standard X axis (blue).
$endgroup$
– Matt
Mar 18 '15 at 1:08
$begingroup$
Can you be more specific about how you approach the problem? What exactly are you using?
$endgroup$
– Olivier
Mar 13 '15 at 19:14
$begingroup$
Can you be more specific about how you approach the problem? What exactly are you using?
$endgroup$
– Olivier
Mar 13 '15 at 19:14
$begingroup$
@Olivier I posted a more detailed version of the question here
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:18
$begingroup$
@Olivier I posted a more detailed version of the question here
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:18
$begingroup$
Has it not been answered?
$endgroup$
– Olivier
Mar 13 '15 at 19:19
$begingroup$
Has it not been answered?
$endgroup$
– Olivier
Mar 13 '15 at 19:19
$begingroup$
Nope. I've asked on Reddit, Unity Answers, Game Dev stack, and here. No answer, at least not an acceptable one that actually answers my question.
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:20
$begingroup$
Nope. I've asked on Reddit, Unity Answers, Game Dev stack, and here. No answer, at least not an acceptable one that actually answers my question.
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:20
1
1
$begingroup$
Your nice animation shows 3 rotations, with 9 vectors. Which are X and Y? You should be able to just keep multiplying the object's current quaternion by the new finger-swipe quaternion, and it should work. The problem is unlikely to be in your other transformations. It looks like using a quaternion for step 1 is a waste of time since you could directly get the result of step 2 with a sin and cos. Then steps 3 and 4 seem to be the source of your problem -- rotating around the rotated X axis (red) is exactly what you don't like. Just rotate around the standard X axis (blue).
$endgroup$
– Matt
Mar 18 '15 at 1:08
$begingroup$
Your nice animation shows 3 rotations, with 9 vectors. Which are X and Y? You should be able to just keep multiplying the object's current quaternion by the new finger-swipe quaternion, and it should work. The problem is unlikely to be in your other transformations. It looks like using a quaternion for step 1 is a waste of time since you could directly get the result of step 2 with a sin and cos. Then steps 3 and 4 seem to be the source of your problem -- rotating around the rotated X axis (red) is exactly what you don't like. Just rotate around the standard X axis (blue).
$endgroup$
– Matt
Mar 18 '15 at 1:08
|
show 5 more comments
1 Answer
1
active
oldest
votes
$begingroup$
I think your problem is related to frame of reference. Your global frame is A and other frames obtained after rotation in A are local frames (such as B). So u want all your rotations in global frame but they are taking place in local frame. For rotation in global frame of reference you need to pre-multiply the transformation matrix and for rotation in local frame, post-multiply. For eg, if u want rotation by $theta_1$ in A for which transformation matrix is $R_{theta_1}$ and then rotation by $theta_2$ in A (rotation matrix $R_{theta_2}$), then:
$$V_f = R_{theta_2}*R_{theta_1}*V_i$$
where $V_i$ is initial position of the point(or object) and $V_f$ is final.
for further reference, check this link:
Maths - frame-of-reference for combining rotations
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f1178558%2frotate-object-around-a-fixed-coordinate-axis%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
I think your problem is related to frame of reference. Your global frame is A and other frames obtained after rotation in A are local frames (such as B). So u want all your rotations in global frame but they are taking place in local frame. For rotation in global frame of reference you need to pre-multiply the transformation matrix and for rotation in local frame, post-multiply. For eg, if u want rotation by $theta_1$ in A for which transformation matrix is $R_{theta_1}$ and then rotation by $theta_2$ in A (rotation matrix $R_{theta_2}$), then:
$$V_f = R_{theta_2}*R_{theta_1}*V_i$$
where $V_i$ is initial position of the point(or object) and $V_f$ is final.
for further reference, check this link:
Maths - frame-of-reference for combining rotations
$endgroup$
add a comment |
$begingroup$
I think your problem is related to frame of reference. Your global frame is A and other frames obtained after rotation in A are local frames (such as B). So u want all your rotations in global frame but they are taking place in local frame. For rotation in global frame of reference you need to pre-multiply the transformation matrix and for rotation in local frame, post-multiply. For eg, if u want rotation by $theta_1$ in A for which transformation matrix is $R_{theta_1}$ and then rotation by $theta_2$ in A (rotation matrix $R_{theta_2}$), then:
$$V_f = R_{theta_2}*R_{theta_1}*V_i$$
where $V_i$ is initial position of the point(or object) and $V_f$ is final.
for further reference, check this link:
Maths - frame-of-reference for combining rotations
$endgroup$
add a comment |
$begingroup$
I think your problem is related to frame of reference. Your global frame is A and other frames obtained after rotation in A are local frames (such as B). So u want all your rotations in global frame but they are taking place in local frame. For rotation in global frame of reference you need to pre-multiply the transformation matrix and for rotation in local frame, post-multiply. For eg, if u want rotation by $theta_1$ in A for which transformation matrix is $R_{theta_1}$ and then rotation by $theta_2$ in A (rotation matrix $R_{theta_2}$), then:
$$V_f = R_{theta_2}*R_{theta_1}*V_i$$
where $V_i$ is initial position of the point(or object) and $V_f$ is final.
for further reference, check this link:
Maths - frame-of-reference for combining rotations
$endgroup$
I think your problem is related to frame of reference. Your global frame is A and other frames obtained after rotation in A are local frames (such as B). So u want all your rotations in global frame but they are taking place in local frame. For rotation in global frame of reference you need to pre-multiply the transformation matrix and for rotation in local frame, post-multiply. For eg, if u want rotation by $theta_1$ in A for which transformation matrix is $R_{theta_1}$ and then rotation by $theta_2$ in A (rotation matrix $R_{theta_2}$), then:
$$V_f = R_{theta_2}*R_{theta_1}*V_i$$
where $V_i$ is initial position of the point(or object) and $V_f$ is final.
for further reference, check this link:
Maths - frame-of-reference for combining rotations
answered Mar 18 '15 at 6:31
megamindmegamind
714
714
add a comment |
add a comment |
Thanks for contributing an answer to Mathematics Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f1178558%2frotate-object-around-a-fixed-coordinate-axis%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Can you be more specific about how you approach the problem? What exactly are you using?
$endgroup$
– Olivier
Mar 13 '15 at 19:14
$begingroup$
@Olivier I posted a more detailed version of the question here
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:18
$begingroup$
Has it not been answered?
$endgroup$
– Olivier
Mar 13 '15 at 19:19
$begingroup$
Nope. I've asked on Reddit, Unity Answers, Game Dev stack, and here. No answer, at least not an acceptable one that actually answers my question.
$endgroup$
– Christopher Perry
Mar 13 '15 at 19:20
1
$begingroup$
Your nice animation shows 3 rotations, with 9 vectors. Which are X and Y? You should be able to just keep multiplying the object's current quaternion by the new finger-swipe quaternion, and it should work. The problem is unlikely to be in your other transformations. It looks like using a quaternion for step 1 is a waste of time since you could directly get the result of step 2 with a sin and cos. Then steps 3 and 4 seem to be the source of your problem -- rotating around the rotated X axis (red) is exactly what you don't like. Just rotate around the standard X axis (blue).
$endgroup$
– Matt
Mar 18 '15 at 1:08