Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by scarecrow77 · Jan 16, 2013 at 08:35 PM · 2dtexture3ddirectionvector

Relation between two 3D vectors that are in the same plane, to translate to 2D

Hello,

I've never asked a question on here or any other answering site but this has been bugging me for days and I'm sure there must be an easy answer to it.

  • I have two 3D unit (normalised) direction vectors D1 and D2 (so they go from point 0,0,0 in some direction).

  • Both D1 and D2 lie in the same plane (so there is a particular view in which if you look at the direction vectors from this point they will appear to look like one vector).

  • I have another unit direction vector, this time in 2D called T1.

  • I want the 2D unit direction vector T2 that is some rotation round from T1.

  • Going back to the 3D direction vectors, they share a normal because they are in the same plane. If I look at the 3D vectors from a point along this normal then in 2D T2 should be at a rotation from T1 that is the same as from D2 to D1.

Thank you!

I've drawn this too: alt text

photo.jpg (207.0 kB)
Comment
Add comment · Show 8
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Vonni · Jan 17, 2013 at 12:08 AM 0
Share

Could you say what you are doing with this, might make it easier to help you.

avatar image scarecrow77 · Jan 17, 2013 at 06:30 AM 0
Share

I'm trying to make it so I can draw a 2D line (on the part of the texture that represents the triangle) in the direction of a 3D direction vector that is in the same plane as the triangle. I was thinking initially that I could use a quaternion for this but I couldn't find anywhere that explained how to get the quaternion between two vectors that was relative to an arbitrary plane in 3D space so that I could apply this quaternion to a 2D vector and get the direction I wanted relative to the side of a triangle. I hope this helps :-)

avatar image whydoidoit · Jan 17, 2013 at 07:26 AM 0
Share

Does this help: http://stackoverflow.com/questions/8942950/how-do-i-find-the-orthogonal-projection-of-a-point-onto-a-plane

You basically want to project the vector onto the plane right? that way you'd be able to get the equation of the line...

avatar image scarecrow77 · Jan 17, 2013 at 09:34 AM 0
Share

Hmmm, I already have the points on the plane of the triangle. An interesting idea might be to get the orthogonal projection of my vectors on the ground (plane with position 0,0,0 and normal UP) and then get the quaternion between them...On second thought I don't think this would work well if the triangle plane was completely vertical resulting in the two projected vectors being just one solid line. I thought I'd post this anyway incase 1)I'm wrong OR 2)It gives someone else some inspiration somehow. Thank you :-)

avatar image whydoidoit · Jan 17, 2013 at 09:38 AM 0
Share

Ok I must be missing something. If you have the points on the 2d plane then the direction is just the normalised difference between them isn't it?

Show more comments

4 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by scarecrow77 · Jan 23, 2013 at 10:25 PM

The real answer to my question and indeed a much much better explanation can be found here: http://answers.unity3d.com/questions/383804/calculate-uv-coordinates-of-3d-point-on-plane-of-m.html :-)

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
1

Answer by aldonaletto · Jan 17, 2013 at 10:51 PM

Well, if you just want to copy the angle between 3D unit vectors to 2D vectors, the job is easier. A possible solution is to calculate sin and cos from the 3D vectors, and use them to position the 2D vector. Since the vectors D1 and D2 are normalized (unit length), the ubiquitous Dot and Cross products can do the job: Dot(D1, D2) returns the cosine, and Cross(D1, D2) return a vector normal to D1 and D2 whose length is the sine of the angle. Putting all stuff together:

 ...
 var sin: float = Vector3.Cross(D1, D2).magnitude; // calculate sine...
 var cos: float = Vector3.Dot(D1, D2); // and cosine of the angle between D1,D2
 // create a copy of T1 rotated 90 degrees clockwise:
 var T1Right: Vector2 = Vector2(T1.y, -T1.x);
 // now calculate T2 = T1 rotated by the same angle as D2:
 T2 = T1 * cos + T1Right * sin;

This works fine if D1 and D2 are unit vectors, and T2 results the same size as T1.
NOTE: From your original question, I thought you were trying to map some point inside a mesh triangle to its equivalent in uv coordinates - if so, this may only work for plane surfaces: the mesh triangles in curved areas frequently have shapes different from the ones found in the uv map. If this is the case, you should instead interpolate the uv values according to the desired point - this article gives some hints about triangle interpolation.

Comment
Add comment · Show 4 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image scarecrow77 · Jan 17, 2013 at 11:08 PM 0
Share

Hey yeah I just tried this out and it's definitely a lot like what I want however it doesn't seem to work with all angles. The directions of D1 and D2 are arbitrary and so could be the other way round (D1 where D2 is and D2 where D1 is) I think this is where it is going wrong? Thanks a lot for helping! :-)!

avatar image aldonaletto · Jan 18, 2013 at 12:13 AM 0
Share

You're right: I forgot that Cross(D1,D2).magnitude has no polarity - this works fine only for 180 degrees, and mirror the T2 vector in the other 180 degrees. Actually, we don't have any reference to tell us when D2 is "to the left" of D1: the plane they form flips 180 degrees when they cross each other. If there's another fixed vector D3, D1 and D3 can define a fixed plane, and the correct angle D1,D2 can be calculated.

avatar image scarecrow77 · Jan 18, 2013 at 08:13 PM 0
Share

Oh hmmm ok right I'm thinking about it with a fresh brain now and you've made me think about my problem differently with your 'NOTE'. I hadn't takn into consideration how much the shape of a triangle can change when going from mesh to uv coordinates. I think you're right about some kind of interpolation? I don't really know much about that subject so I'm going to have a look through the link you've given. Basically I have a line that goes along the plane of a triangle on my mesh (3D) and I want to translate this line to uv coordinates so I can draw a line on the triangle's texture representing the line along the triangle in 3D space :-) I understand a bit more where senad was co$$anonymous$$g from now as well

avatar image scarecrow77 · Jan 19, 2013 at 09:40 PM 0
Share

I've asked another question to help me work out my entire problem here: http://answers.unity3d.com/questions/383804/calculate-uv-coordinates-of-3d-point-on-plane-of-m.html After I've got the answer to that I'll sort out this question so it isn't left hanging. It's my first time using sites like this so I've made a little bit of a mess of it but hopefully I can sort it out :-)

avatar image
0

Answer by senad · Jan 17, 2013 at 08:49 AM

So let us say that you have AB, which consists of the vectors/points A and B. And you have F which consists of the vectors/points F1 and F2.

What you have is A, B, At, Bt, F1 and F2. What you need to find ist F1t and F2t. Let us ignore that the t vectors are in 2D, we could just set one coordinate to zero.

Then there is a transformation matrix that will transform A -> At, B -> Bt, F1 -> F1t, F2 -> F2t. If you can derive the matrix from AB and AtBt, then you could easily transform F??

Are the tex coords chosen manually by you or an artist? Then maybe you can find a way to formalize the transformation in to the matrix??

Maybe there is a much easier way to think about it. :D

Comment
Add comment · Show 10 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image scarecrow77 · Jan 17, 2013 at 09:27 AM 0
Share

I think this is close to something I want, I thought about using matrices but I found very little information about using them with Unity and so thought quaternions were the preferred way of representing rotations. I think it would be possible to get the rotation matrix from AB to AtBt and then apply that matrix to F to get Ft??? That sounds right in my head (please correct me if I'm wrong and you have to do it with each individual point i.e A -> At) but I have absolutely no idea how to get the rotation matrix between two direction vectors in Unity and I have even less of an idea of how to apply that matrix to F in order to get an Ft. I have been looking around since you posted this but like I said I cannot find much info on Unity matrices. Thank you for your time, I think this is definitely on the right track :-)

avatar image scarecrow77 · Jan 17, 2013 at 09:36 AM 0
Share

Oh and I know the tex coords. As in they're made by the artist but I retrieve them from my mesh using $$anonymous$$esh.uv. Which gives me the uv coord of each vertex. Hope this helps :-)

avatar image senad · Jan 17, 2013 at 09:48 AM 0
Share

On second thought, i think I am beginning to really understand your problem. :D

What you want to do to get the tex coords for F is bilinear interpolation inside your triangle. :) It might be a little hard to do in 3D space, so maybe you want to project everything to a 2D plane, to not break your brain. :D

I think it should also work, if F is outside of the triangle.

avatar image scarecrow77 · Jan 17, 2013 at 10:12 AM 0
Share

But what I don't understand is that if I projected everything to a 2D plane let's say the ground with position 0,0,0 and normal UP then if the triangle was vertically aligned and so the normal of the triangle is perpendicular to the "ground" then the projection of the two vector lines won't project very well because the lines will be perpendicular to the ground. Surely there must be some way in Unity to get the rotation matrix between two vectors and then some other way of creating a vector by rotating a currently existing vector by the rotation matrix? That way I'd have the rotation matrix $$anonymous$$ which rotated from AB to AtBt and then I could apply $$anonymous$$ to F to get Ft??

avatar image whydoidoit · Jan 17, 2013 at 12:56 PM 1
Share

Oooo my brain just melted. Better mop that up and go back to drawing random lines on bits of paper!

Show more comments
avatar image
0

Answer by kru · Jan 22, 2013 at 08:46 AM

Judging by your picture and the description, it seems that you just need the angle between D1 and D2. float alpha = Vector3.angle(D1, D2);

Then you take your T1 and rotate it by alpha. Vector2 T2 = new Vector2(T1.x Mathf.Cos(alpha), T1.y Mathf.Sin(alpha));

No?

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

13 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Making sprites just rotate and not tilt. 3 Answers

How to make a half 2d- half 3d main menu?? 1 Answer

How do I create a vector that always points down locally 1 Answer

How can I animate the surface of a 3D object? 0 Answers

2D eyes on 3D character? 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges