Jump to content
  • Advertisement
Sign in to follow this  

3D calculate new vector with desired length

This topic is 2263 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

[font=arial,helvetica,sans-serif]Hello Guys,[/font]

[font=arial,helvetica,sans-serif]I'm quite new in XNA 3D, and new in 3D as well, so I need a bit help about the following issue.[/font]

[font=arial,helvetica,sans-serif]I have two different models on the screen. For the left mouse click I can set the position of the model A, with the right mouse click I can do the same for model B.[/font]

[font=arial,helvetica,sans-serif]To create 3D position from mouse click I use the following method:[/font]

[font=courier new,courier,monospace]
public static Vector3 GetPickedPosition(Vector2 position)
var nearSource = new Vector3(position, 0f);
var farSource = new Vector3(position, 1.0f);[/font]
[font=courier new,courier,monospace] Vector3 nearPoint = Interface.Graphics.GraphicsDevice.Viewport.Unproject(nearSource,
Camera.View, Matrix.Identity);[/font]
[font=courier new,courier,monospace] Vector3 farPoint = Interface.Graphics.GraphicsDevice.Viewport.Unproject(farSource,
Camera.View, Matrix.Identity);[/font]
[font=courier new,courier,monospace] Vector3 direction = farPoint - nearPoint;
[font=courier new,courier,monospace] var r = new Ray(nearPoint, direction);[/font]
[font=courier new,courier,monospace] var n = new Vector3(0f, 1f, 0f);
var p = new Plane(n, 0f);[/font]
[font=courier new,courier,monospace] float denominator = Vector3.Dot(p.Normal, r.Direction);
float numerator = Vector3.Dot(p.Normal, r.Position) + p.D;
float t = -(numerator/denominator);[/font]
[font=courier new,courier,monospace] Vector3 pickedPosition = nearPoint + direction*t;[/font]
[font=courier new,courier,monospace] return pickedPosition;

It's working very well. The problem begins when I would like to modify the model B position programatically.

The goal what I would like to reach is if I define a new position on the screen for model B, the distance between the model A and model B position will be constant, but model B should keep the same angle\direction to the model A

Like this: http://imageupload.org/en/file/241642/problem.jpg.html

I tried to do it by myself with this method:

position of model B = GetPickedPosition(mousepos for model B) - model A position

after normalize the position of model B and finally * desired distance.

This was only an option in my many tries, but nothing worked. position of model B wasn't was when if I simply use the GetPickedPosition method.

Can anyone help me with it?

Thank you

Share this post

Link to post
Share on other sites
My assumption: you want to right click somewhere, and if that's outside the distance you allow between A and B, B is placed as far away from A as distance allows along the vector formed between A's position and the right-clicked position. The following tries to solve that assumed problem. Pseudocode is used, in most places.

//Calculate the ray between A's position and B's "clicked" position (i.e. where you right clicked).
Vector3 tempVector = GetPickedPosition(rightClickedScreenPos) - A.position;


//Calculate the furthest possible point from A along that temp vector's direction by multiplying normalized vector and distance and then assign that to B's position
B.position = A.position + (tempVector * distance);

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!