ITS WORKING! simple 3d slicey movement

This commit is contained in:
2018-04-01 03:56:47 -04:00
parent 26bd1d2606
commit 9cb8b1ab09
2 changed files with 80 additions and 29 deletions

View File

@@ -6,6 +6,9 @@ namespace Tetrahedrons
// ReSharper disable once InconsistentNaming
public struct MVec3d
{
public static readonly MVec3d Zero = new MVec3d(0, 0, 0, 0, 0, 0, 0, 0);
public static readonly MVec3d One = new MVec3d(1, 1, 1, 1, 1, 1, 1, 1);
public static readonly MVec3d Unit = new MVec3d(1, 0, 0, 0, 0, 0, 0, 0);
public static readonly MVec3d Unit1 = new MVec3d(0, 1, 0, 0, 0, 0, 0, 0);
public static readonly MVec3d Unit2 = new MVec3d(0, 0, 1, 0, 0, 0, 0, 0);

View File

@@ -4,6 +4,7 @@ using System.Drawing;
using System.Net.Mail;
using System.Security;
using OpenTK;
using OpenTK.Audio.OpenAL;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
@@ -164,7 +165,8 @@ namespace Tetrahedrons
public class TetrahedronWindow : GameWindow
{
private Matrix4 _proj;
private Matrix4 _proj3d;
private Matrix4 _proj2d;
private Matrix4 _view;
private double _t;
@@ -173,6 +175,10 @@ namespace Tetrahedrons
private Tetrahedron _tetra;
private Polygon _polyg;
private MVec3d _b1 = MVec3d.Unit1;
private MVec3d _b2 = MVec3d.Unit3;
private MVec3d _pivot = MVec3d.Zero;
private Polygon _square = new Polygon(new[] {new Vector3d(-1, -1, 0), new Vector3d(-1, 1, 0), new Vector3d(1, -1, 0), new Vector3d(1, 1, 0),}, Color.Red);
protected override void OnLoad(EventArgs e)
@@ -197,31 +203,41 @@ namespace Tetrahedrons
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.PointSize(10f);
// _view = Matrix4.LookAt(Vector3.Zero, new Vector3((float) Math.Cos(_t / 5), (float) Math.Sin(_t / 5), -1), Vector3.UnitZ);
GL.PushMatrix();
GL.MatrixMode(MatrixMode.Projection);
GL.LoadMatrix(ref _proj);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref _view);
GL.Enable(EnableCap.DepthTest);
_tetra.Draw(wire: false);
GL.Disable(EnableCap.DepthTest);
if (_div)
{
GL.PushMatrix();
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref Matrix4d.Identity);
_square.Draw();
GL.MatrixMode(MatrixMode.Projection);
GL.LoadMatrix(ref _proj2d);
_polyg.Draw();
GL.PopMatrix();
}
else
{
GL.MatrixMode(MatrixMode.Projection);
GL.LoadMatrix(ref _proj3d);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref _view);
GL.Enable(EnableCap.DepthTest);
_tetra.Draw(wire: false);
GL.Disable(EnableCap.DepthTest);
_polyg.Draw();
GL.Enable(EnableCap.DepthTest);
_tetra.Draw(wire: true);
GL.Begin(PrimitiveType.Points);
GL.Color3(Color.DarkBlue);
GL.Vertex3(_pivot.VectorPart);
GL.End();
GL.Begin(PrimitiveType.Lines);
GL.Vertex3(_pivot.VectorPart);
GL.Vertex3((_pivot + (_b2 ^ _b1) * MVec3d.Unit123 * .5).VectorPart);
GL.End();
GL.Enable(EnableCap.DepthTest);
_tetra.Draw(wire: true);
}
GL.PopMatrix();
@@ -231,9 +247,36 @@ namespace Tetrahedrons
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
_proj = Matrix4.CreateOrthographic(6, 6f * Height / Width, -2, 2);
_proj3d = Matrix4.CreateOrthographic(6, 6f * Height / Width, -2, 2);
_proj2d = Matrix4.CreateOrthographic(4, 4f * Height / Width, -1, 1);
_t += e.Time;
if (Keyboard[Key.Left])
{
var rot = MVec3d.Complex(-e.Time, MVec3d.Unit12);
_b1 = rot * _b1 * ~rot; // todo make blade classes
_b2 = rot * _b2 * ~rot;
}
if (Keyboard[Key.Right])
{
var rot = MVec3d.Complex(e.Time, MVec3d.Unit12);
_b1 = rot * _b1 * ~rot;
_b2 = rot * _b2 * ~rot;
}
if (Keyboard[Key.Up])
{
_pivot -= (_b1 ^ _b2) * MVec3d.Unit123 * e.Time;
}
if (Keyboard[Key.Down])
{
_pivot += (_b1 ^ _b2) * MVec3d.Unit123 * e.Time;
}
if (_pause)
return;
@@ -241,15 +284,15 @@ namespace Tetrahedrons
// var b2 = MVec3d.Unit3;
// var pivot = new Vector3d(Math.Cos(_t), 0, 0);
var b1 = MVec3d.Vector(0, Math.Cos(_t * .2), Math.Sin(_t * .5));
var b2 = MVec3d.Vector(Math.Cos(_t * .6), 0, Math.Sin(_t * .4));
var pivot = Vector3d.Zero;
// var b1 = MVec3d.Vector(0, Math.Cos(_t * .2), Math.Sin(_t * .5));
// var b2 = MVec3d.Vector(Math.Cos(_t * .6), 0, Math.Sin(_t * .4));
// var pivot = Vector3d.Zero;
// var b1 = MVec3d.Vector(Math.Cos(_t/2), Math.Sin(_t/2), 0);
// var b2 = MVec3d.Unit3;
// var pivot = Vector3d.Zero;
var blade = MVec3d.Outer(b1, b2);
// var blade = MVec3d.Outer(b1, b2);
// var rot = MVec3d.Complex(_t / 2, MVec3d.Unit12);
// var b1 = rot * MVec3d.Unit2 * ~rot;
@@ -258,19 +301,19 @@ namespace Tetrahedrons
// var blade = pln;
// var pivot = Vector3d.Zero;
Console.Out.WriteLine("b1 = {0}", b1);
Console.Out.WriteLine("b2 = {0}", b2);
_polyg = _tetra.Intersection(blade, pivot);
_polyg = _tetra.Intersection(_b1 ^ _b2, _pivot.VectorPart);
if (_div)
{
var px = ((_pivot & _b1) * ~_b1) & _b1;
var py = ((_pivot ^ _b1) * ~_b1) & ((_b2 ^ _b1) * ~_b1);
for (var i = 0; i < _polyg.Points.Length; i++)
{
MVec3d p = _polyg.Points[i];
var x = ((p & b1) * ~b1) & b1;
var y = ((p ^ b1) * ~b1) & ((b2 ^ b1) * ~b1);
_polyg.Points[i] = new Vector3d(x.E, y.E, 0);
var x = ((p & _b1) * ~_b1) & _b1;
var y = ((p ^ _b1) * ~_b1) & ((_b2 ^ _b1) * ~_b1);
_polyg.Points[i] = new Vector3d(x.E - px.E, y.E - py.E, 0);
}
}
}
@@ -287,6 +330,11 @@ namespace Tetrahedrons
case Key.A:
_div = !_div;
break;
case Key.R:
_b1 = MVec3d.Unit1;
_b2 = MVec3d.Unit3;
_pivot = MVec3d.Zero;
break;
}
}
}