Sign in to follow this  
TheSkyline13

[Solved] Moving Object With Mouse - C# Directx

Recommended Posts

TheSkyline13    124
I have some code that partially works but once it goes a certain distance it stops moving.

The distance is calculated using sin rule, the angles of the last and current direction dot the direction of X (1,0,0).

float distance = (float)(Math.Sin(Math.Acos(Vector3.Dot(Direction, new Vector3(1, 0, 0)))) * 
((Camera.Position - MoveTool.Position).Length() / Math.Sin(Math.Acos(Vector3.Dot(d, new Vector3(1, 0, 0))))));

MoveTool.Position.X += (d - Direction).X * distance;
Direction = d;


Direction and d are just unit vectors based on the mouses current position in 3d space. Which I get using this:

Vector3 d = Vector3.Unproject(new Vector3(e.X, e.Y, 1f), Device.Viewport,
Device.Transform.Projection, Camera.View, Matrix.Identity);

d.Multiply(1 / d.Length());


d being the current position, and Direction being the previous direction of the mouse.

distance is the length from the camera position to the new position MoveTool should be at. I multiply it by the difference between d and Direction, which should be the change of the x direction. Then add it to the position of the MoveTool.

This is the result: http://www.youtube.com/watch?v=V54zgB5iAC8

The position of the mouse is off in that video, but it shows the general movement and how the position isn't changing with the mouse.

[Edited by - TheSkyline13 on October 18, 2010 6:50:40 PM]

Share this post


Link to post
Share on other sites
Argo15    122
I can give you an alternative way to do this.

Get the line down the axes your dragging along, like the yellow line here for the red axes.
Photobucket

Then, get the line that the mouse point makes. (should be easy using UnProject)

Calculate the point on the axes line that is closest to the the mouse line.

Whenever you move the mouse, do the same thing and get the difference and apply that difference to the models location.

Here is the code I used find the closest point to intersection of the two lines.

static ArgoVector3 getDragPoint(ArgoVector3 *dragLine, ArgoVector3 *unProjLine)
{
ArgoVector3 P0(dragLine[0]);
ArgoVector3 Vp(dragLine[1]);
ArgoVector3 Q0(unProjLine[0]);
ArgoVector3 Vq(unProjLine[1]);
float a;
float b[2];
float c[2];
float s;

Vp.normalize();
Vq.normalize();

a=1.0/(1.0-(Vp.dot(Vq)*Vp.dot(Vq)));

b[0]=a;
b[1]=Vp.dot(Vq)*a;

c[0]=ArgoVector3(Q0-P0).dot(Vp);
c[1]=ArgoVector3(P0-Q0).dot(Vq);

s=b[0]*c[0]+b[1]*c[1];

ArgoVector3 dragPoint(P0+Vp*s);

return dragPoint;
}








video if your interested
http://www.youtube.com/watch?v=yxwQPRbFUKw

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this