public void Render(Matrix4 view) { if (b == null) return; Matrix4 mat = b.transform; Vector3 center = Vector3.Transform(Vector3.Zero, mat); Vector3 point; hit = false; bool _hiX = false; bool _hiY = false; bool _hiZ = false; if (RenderTools.CheckSphereHit(center, 2, VBNViewport.p1, VBNViewport.p2, out point)) { hit = true; VBNViewport.LineSphereIntersect(VBNViewport.p1, VBNViewport.p2, center, 2, out point); Vector3 angle = Angles(Vector3.Transform(point, b.invert)) * new Vector3(180f / (float)Math.PI); angle.X = Math.Abs(angle.X); angle.Y = Math.Abs(angle.Y); angle.Z = Math.Abs(angle.Z); //Console.WriteLine(angle.ToString()); float _axisSnapRange = 7f; if (Math.Abs(angle.Y - 90.0f) <= _axisSnapRange) _hiX = true; else if (angle.X >= (180.0f - _axisSnapRange) || angle.X <= _axisSnapRange) _hiY = true; else if (angle.Y >= (180.0f - _axisSnapRange) || angle.Y <= _axisSnapRange) _hiZ = true; } GL.PushMatrix(); GL.MultMatrix(ref mat); GL.Color3(_hiX ? Color.Yellow : Color.Green); GL.LineWidth(2); RenderTools.drawCircleOutline(Vector3.Zero, 2, 25); GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f); GL.Color3(_hiY ? Color.Yellow : Color.Red); RenderTools.drawCircleOutline(Vector3.Zero, 2, 25); GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f); GL.Color3(_hiZ ? Color.Yellow : Color.Blue); RenderTools.drawCircleOutline(Vector3.Zero, 2, 25); GL.PopMatrix(); }
private void RenderRotationTool(Camera Camera, Ray Ray) { Matrix4 mat = b.transform.ClearScale(); Vector3 center = Vector3.TransformPosition(Vector3.Zero, mat); Matrix4 invTrasnform = b.transform.ClearScale().Inverted(); Vector3 point; if (state == 0) { hit = Ray.LineSphereIntersect(center, Size, out point); if (hit) { Vector3 angle = Angles(Vector3.TransformPosition(point, invTrasnform)) * new Vector3(180f / (float)Math.PI); angle.X = Math.Abs(angle.X); angle.Y = Math.Abs(angle.Y); angle.Z = Math.Abs(angle.Z); _hiX = false; _hiY = false; _hiZ = false; float _axisSnapRange = 14f; if (Math.Abs(angle.Y - 90.0f) <= _axisSnapRange) { _hiX = true; } else if (angle.X >= (180.0f - _axisSnapRange) || angle.X <= _axisSnapRange) { _hiY = true; } else if (angle.Y >= (180.0f - _axisSnapRange) || angle.Y <= _axisSnapRange) { _hiZ = true; } } if (!_hiX && !_hiZ && !_hiY) { hit = false; } } if (state == 1) { float sx = (Ray.mouse_x - PrevPoint.X) / 100; float sy = (Ray.mouse_y - PrevPoint.Y) / 100; float s = sx + sy; if (_hiX) { b.rot = b.rot * Quaternion.FromAxisAngle(Vector3.UnitX, s); } if (_hiY) { b.rot = b.rot * Quaternion.FromAxisAngle(Vector3.UnitY, s); } if (_hiZ) { b.rot = b.rot * Quaternion.FromAxisAngle(Vector3.UnitZ, s); } b.vbnParent.update(); } GL.PushMatrix(); GL.MultMatrix(ref mat); GL.Color4(0.25f, 0.25f, 0.25f, 0.2f); RenderTools.drawSphere(Vector3.Zero, Size, 25); GL.Color3(_hiZ ? Color.Yellow : Color.Green); GL.LineWidth(3); RenderTools.drawCircleOutline(Vector3.Zero, Size, 25); GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f); GL.Color3(_hiX ? Color.Yellow : Color.Red); RenderTools.drawCircleOutline(Vector3.Zero, Size, 25); GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f); GL.Color3(_hiY ? Color.Yellow : Color.Blue); RenderTools.drawCircleOutline(Vector3.Zero, Size, 25); GL.PopMatrix(); }
public void Render(Matrix4 view) { if (b == null) { return; } Matrix4 mat = b.transform; Vector3 center = Vector3.Transform(Vector3.Zero, mat); Vector3 camPoint = Vector3.Transform(Vector3.Zero, view); Matrix4 rot = mat; float Radius = CamDistance(center, camPoint);// / 1 * (Runtime.fov / 45.0f) * 1.0f; Vector3 lineStart = VBNViewport.p1; Vector3 lineEnd = VBNViewport.p2; Vector3 normal = new Vector3(0); Matrix4 invTrasnform = mat.Inverted(); Vector3 point; Console.WriteLine(LineSphereIntersect(VBNViewport.p1, VBNViewport.p2, center, Radius, out point)); float Distance = CamDistance(point, center); hit = false; bool _hiX = false; bool _hiY = false; bool _hiZ = false; Console.WriteLine(Distance + " " + Radius); if (Math.Abs(Distance - Radius) < (Radius * 3)) { hit = true; Vector3 angle = Angles(Vector3.Transform(point, invTrasnform)) * new Vector3(180f / (float)Math.PI); angle.X = Math.Abs(angle.X); angle.Y = Math.Abs(angle.Y); angle.Z = Math.Abs(angle.Z); //Console.WriteLine(angle.ToString()); float _axisSnapRange = 7f; if (Math.Abs(angle.Y - 90.0f) <= _axisSnapRange) { _hiX = true; } else if (angle.X >= (180.0f - _axisSnapRange) || angle.X <= _axisSnapRange) { _hiY = true; } else if (angle.Y >= (180.0f - _axisSnapRange) || angle.Y <= _axisSnapRange) { _hiZ = true; } } GL.PushMatrix(); GL.MultMatrix(ref mat); GL.Color3(_hiX ? Color.Yellow : Color.Green); GL.LineWidth(2); RenderTools.drawCircleOutline(Vector3.Zero, 2, 25); GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f); GL.Color3(_hiY ? Color.Yellow : Color.Red); RenderTools.drawCircleOutline(Vector3.Zero, 2, 25); GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f); GL.Color3(_hiZ ? Color.Yellow : Color.Blue); RenderTools.drawCircleOutline(Vector3.Zero, 2, 25); GL.PopMatrix(); }