# 3D calculate new vector with desired length

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

## 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.Projection, Camera.View, Matrix.Identity);[/font] [font=courier new,courier,monospace] Vector3 farPoint = Interface.Graphics.GraphicsDevice.Viewport.Unproject(farSource, Camera.Projection, Camera.View, Matrix.Identity);[/font] [font=courier new,courier,monospace] Vector3 direction = farPoint - nearPoint; direction.Normalize();[/font] [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; } [/font]

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

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 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; //Normalize tempVector.Normalize(); //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 on other sites
Thank you! Perfect! Seems I missed to add the A position:/