- Edited
I have tried and tried for days now and I cant figure out a way to simply have the mouse cursor have a "3d mouse" or a random 3d object appear infront of another object, or "glide across" a larger. I know there has to be a simple way to do this.
This is what I have done. It does work sometimes, but it will rapidly flash between to positions sometimes, most of the time.
public override void _Input(InputEvent @event)
{
var emb = @event;
if (emb is InputEventMouseMotion)
{
var mouse_position = GetViewport().GetMousePosition();
var from = camera.ProjectRayOrigin(mouse_position);
var direct_state = GetWorld().DirectSpaceState;
var collision = direct_state.IntersectRay(GlobalTransform.origin, new Godot.Vector3(0, 0, -distance_from_camera), new Godot.Collections.Array { this.GetParent().GetNode("Player"), this.GetParent().GetNode("Player").GetNode("CollisionShape"), this.GetParent().GetNode("Player").GetNode("CameraRig"), selfy, selfy.GetNode("CollisionShape"), this.GetParent() });
Transform positionz = this.GlobalTransform;
var to = from + camera.ProjectRayNormal(mouse_position) * distance_from_camera;
positionz.origin = to;
if (collision.Contains("position") && collision.Count != 0)
{
var tempV3 = (Godot.Vector3)collision["position"];
var closeCol = (Transform.origin - tempV3).Length();
//GD.Print(closeCol + " " + collision["collider_id"] + " " + collision["collider"] + " " + collision["rid"] + " " + collision["position"]);
if (closeCol <= distance_from_camera * 1.5 && closeCol > distance_from_camera)
{
to = from + camera.ProjectRayNormal(mouse_position) * (distance_from_camera + closeCol + offset);
//var to = tempV3;
GD.Print("INHERE-1- " + to + " " + closeCol);
positionz.origin = to;
}
else if (closeCol <= distance_from_camera)
{
to = from + camera.ProjectRayNormal(mouse_position) * (closeCol + offset);
//var to = tempV3;
GD.Print("INHERE-2- " + to + " " + closeCol);
positionz.origin = to;
}
else
{
to = from + camera.ProjectRayNormal(mouse_position) * distance_from_camera;
//var to = tempV3;
GD.Print("sOmeWhErE- " + to + " " + closeCol);
positionz.origin = to;
}
}
this.GlobalTransform = positionz;
//else
//{
// var to = from + camera.ProjectRayNormal(mouse_position) * distance_from_camera;
// GD.Print("outthere- " + to);
// positionz.origin = to;
// return positionz;
//}
LookAtFromPosition(GlobalTransform.origin, camera.GlobalTransform.origin, Godot.Vector3.Up);
Transform.Rotated(new Vector3(0, 1, 0), (float)Math.PI);
}