• FEATURED

View more

View more

View more

Image of the Day Submit

IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

3D calculate new vector with desired length

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

2 replies to this topic

#1opeca  Members

Posted 01 October 2012 - 12:11 PM

Hello Guys,

I'm quite new in XNA 3D, and new in 3D as well, so I need a bit help about the following issue.

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.

To create 3D position from mouse click I use the following method:

		 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;
}


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

#2BCullis  Members

Posted 02 October 2012 - 12:00 PM

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);


Hazard Pay :: FPS/RTS in SharpDX (gathering dust, retained for... historical purposes)
DeviantArt :: Because right-brain needs love too (also pretty neglected these days)

#3opeca  Members

Posted 02 October 2012 - 12:37 PM

Thank you! Perfect! Seems I missed to add the A position:/

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.