no mo jitto

This commit is contained in:
spatialfree 2022-01-03 07:55:50 -05:00
parent 296e3e5af3
commit ebd00e0021
2 changed files with 70 additions and 78 deletions

View file

@ -19,7 +19,18 @@ mono.Run();
public class Monolith { public class Monolith {
public Mic mic; public Mic mic;
// public Controller rCon, lCon; public Controller rCon, lCon;
public Controller Con(bool chirality) {
return chirality ? rCon : lCon;
}
public Pose rWrist, lWrist;
public Pose Wrist(bool chirality) {
return chirality ? rWrist : lWrist;
}
public Pose rShoulder, lShoulder;
public Pose Shoulder(bool chirality) {
return chirality ? rShoulder : lShoulder;
}
public Vec3 rDragStart, lDragStart; public Vec3 rDragStart, lDragStart;
public float railT; public float railT;
@ -51,8 +62,6 @@ public class Monolith {
matFloor.SetFloat("tex_scale", 32); matFloor.SetFloat("tex_scale", 32);
Cursors cursors = new Cursors(this);
Oriel oriel = new Oriel(); Oriel oriel = new Oriel();
oriel.Start(3); oriel.Start(3);
// Oriel otherOriel = new Oriel(); // Oriel otherOriel = new Oriel();
@ -64,12 +73,12 @@ public class Monolith {
ColorCube colorCube = new ColorCube(); ColorCube colorCube = new ColorCube();
Vec3 oldLPos = Vec3.Zero; Vec3 oldLPos = Vec3.Zero;
SpatialCursor rightCursor = new ReachCursor(); SpatialCursor rightCursor = new ReachCursor(this, true);
SpatialCursor leftCursor = new ReachCursor(); SpatialCursor leftCursor = new ReachCursor(this, false);
bool rightPlanted = false; bool rightPlanted = false;
bool leftPlanted = false; bool leftPlanted = false;
SpatialCursor cubicFlow = new CubicFlow(); SpatialCursor cubicFlow = new CubicFlow(this);
Tex camTex = new Tex(TexType.Rendertarget); Tex camTex = new Tex(TexType.Rendertarget);
camTex.SetSize(600, 400); camTex.SetSize(600, 400);
@ -90,30 +99,45 @@ public class Monolith {
while (SK.Step(() => { while (SK.Step(() => {
Renderer.CameraRoot = Matrix.T(pos); Renderer.CameraRoot = Matrix.T(pos);
Controller rCon = Input.Controller(Handed.Right); rCon = Input.Controller(Handed.Right);
Controller lCon = Input.Controller(Handed.Left); lCon = Input.Controller(Handed.Left);
cube.Draw(matFloor, floor.GetPose().ToMatrix(floorScale), Color.White * 0.666f); cube.Draw(matFloor, floor.GetPose().ToMatrix(floorScale), Color.White * 0.666f);
// Shoulders // Shoulders
Vec3 headPos = Input.Head.position + Input.Head.Forward * -0.15f; Vec3 headPos = Input.Head.position + Input.Head.Forward * -0.15f;
Vec3 toSub = (lCon.pose.position.X0Z - headPos.X0Z).Normalized; Vec3 toLeft = (lCon.pose.position.X0Z - headPos.X0Z).Normalized;
Vec3 toDom = (rCon.pose.position.X0Z - headPos.X0Z).Normalized; Vec3 toRight = (rCon.pose.position.X0Z - headPos.X0Z).Normalized;
Vec3 middl = (toSub + toDom).Normalized; Vec3 middl = (toLeft + toRight).Normalized;
if (Vec3.Dot(middl, Input.Head.Forward) < 0) { if (Vec3.Dot(middl, Input.Head.Forward) < 0) {
middl = -middl; middl = -middl;
} }
// Lines.Add(headPos.X0Z, headPos.X0Z + toSub.X0Z, Color.White, 0.005f); // Lines.Add(headPos.X0Z, headPos.X0Z + toLeft.X0Z, Color.White, 0.005f);
// Lines.Add(headPos.X0Z, headPos.X0Z + toDom.X0Z, Color.White, 0.005f); // Lines.Add(headPos.X0Z, headPos.X0Z + toRight.X0Z, Color.White, 0.005f);
// Lines.Add(headPos.X0Z, headPos.X0Z + middl.X0Z, Color.White, 0.005f); // Lines.Add(headPos.X0Z, headPos.X0Z + middl.X0Z, Color.White, 0.005f);
// cube.Draw(mat, Matrix.TRS(headPos, Input.Head.orientation, new Vec3(0.3f, 0.3f, 0.3f))); // cube.Draw(mat, Matrix.TRS(headPos, Input.Head.orientation, new Vec3(0.3f, 0.3f, 0.3f)));
rShoulder = new Pose(
headPos + Quat.LookDir(middl) * new Vec3(0.2f, -0.2f, 0),
Quat.LookDir(middl)
);
lShoulder = new Pose(
headPos + Quat.LookDir(middl) * new Vec3(-0.2f, -0.2f, 0),
Quat.LookDir(middl)
);
rWrist = new Pose(
rCon.pose.position + rCon.aim.orientation * new Vec3(0, -0.0333f, 0.052f),
rCon.aim.orientation
);
lWrist = new Pose(
lCon.pose.position + lCon.aim.orientation * new Vec3(0, -0.0333f, 0.052f),
lCon.aim.orientation
);
Vec3 rShoulder = headPos + Quat.LookDir(middl) * new Vec3(0.2f, -0.2f, 0);
Vec3 lShoulder = headPos + Quat.LookDir(middl) * new Vec3(-0.2f, -0.2f, 0);
// cube.Draw(mat, Matrix.TRS(headPos, Input.Head.orientation, new Vec3(0.25f, 0.3f, 0.3f)), new Color(1,0,0)); // cube.Draw(mat, Matrix.TRS(headPos, Input.Head.orientation, new Vec3(0.25f, 0.3f, 0.3f)), new Color(1,0,0));
// Lines.Add(headPos + Vec3.Up * -0.2f, rShoulder, new Color(1, 0, 0), 0.01f); // Lines.Add(headPos + Vec3.Up * -0.2f, rShoulder, new Color(1, 0, 0), 0.01f);
// Lines.Add(headPos + Vec3.Up * -0.2f, lShoulder, new Color(1, 0, 0), 0.01f); // Lines.Add(headPos + Vec3.Up * -0.2f, lShoulder, new Color(1, 0, 0), 0.01f);
@ -163,20 +187,16 @@ public class Monolith {
leftPlanted = false; leftPlanted = false;
} }
Vec3 rWrist = rCon.pose.position + rCon.aim.orientation * new Vec3(0, -0.0333f, 0.052f);
rightCursor.Step(new Pose[] { rCon.pose, new Pose(rWrist, rCon.aim.orientation), new Pose(rShoulder, Quat.LookDir(middl)) }, 1);
if (!rightPlanted) { if (!rightPlanted) {
rightCursor.p0 = rCon.pose.position; rightCursor.p0 = rCon.pose.position;
rightCursor.Calibrate(); rightCursor.Calibrate();
// rightCursor.Step(new Pose[] { rCon.pose, new Pose(rShoulder, Quat.LookDir(middl)) }, 1);
} }
Vec3 lWrist = lCon.pose.position + lCon.aim.orientation * new Vec3(0, -0.0333f, 0.052f); rightCursor.Step(new Pose[] { rCon.pose }, 1);
leftCursor.Step(new Pose[] { lCon.pose, new Pose(lWrist, lCon.aim.orientation), new Pose(lShoulder, Quat.LookDir(middl)) }, 1); // ((Input.Controller(Handed.Left).stick.y + 1) / 2)
if (!leftPlanted) { if (!leftPlanted) {
leftCursor.p0 = lCon.pose.position; leftCursor.p0 = lCon.pose.position;
leftCursor.Calibrate(); leftCursor.Calibrate();
// leftCursor.Step(new Pose[] { lCon.pose, new Pose(lShoulder, Quat.LookDir(middl)) }, 1); // ((Input.Controller(Handed.Left).stick.y + 1) / 2)
} }
leftCursor.Step(new Pose[] { lCon.pose }, 1); // ((Input.Controller(Handed.Left).stick.y + 1) / 2)
// cursor.p1 = subCursor.p0; // override *later change all one handed cursors to be dual wielded by default* // cursor.p1 = subCursor.p0; // override *later change all one handed cursors to be dual wielded by default*
cubicFlow.Step(new Pose[] { new Pose(rightCursor.p0, rCon.aim.orientation), new Pose(leftCursor.p0, lCon.aim.orientation) }, 1); cubicFlow.Step(new Pose[] { new Pose(rightCursor.p0, rCon.aim.orientation), new Pose(leftCursor.p0, lCon.aim.orientation) }, 1);

View file

@ -11,21 +11,6 @@ public abstract class SpatialCursor {
public abstract void Calibrate(); public abstract void Calibrate();
} }
public class Cursors {
Monolith mono;
public Cursors(Monolith mono) {
this.mono = mono;
}
SpatialCursor[] oneHanded = new SpatialCursor[] { new ReachCursor(), new TwistCursor() }; int oneIndex = 0;
SpatialCursor[] twoHanded = new SpatialCursor[] { new StretchCursor(), new CubicFlow(), new SupineCursor() };
public SpatialCursor Step(Pose domHand, Pose subHand) {
SpatialCursor cursor = oneHanded[oneIndex];
cursor.Step(new Pose[] { domHand, subHand }, 0);
return cursor;
}
}
public class StretchCursor : SpatialCursor { public class StretchCursor : SpatialCursor {
public StretchCursor() { public StretchCursor() {
this.min = 1f; this.min = 1f;
@ -46,23 +31,22 @@ public class StretchCursor : SpatialCursor {
// this is just a stretch cursor derivative // this is just a stretch cursor derivative
public class ReachCursor : SpatialCursor { public class ReachCursor : SpatialCursor {
public ReachCursor() { Monolith mono;
bool chirality;
public ReachCursor(Monolith mono, bool chirality) {
this.mono = mono;
this.chirality = chirality;
this.min = 1f; this.min = 1f;
this.str = 3f; this.str = 3f;
this.max = 10f; this.max = 10f;
} }
Vec3 pos; Vec3 pos;
Vec3 wrist;
Vec3 origin; Vec3 origin;
Pose shoulder;
// Vec3 yaw;
public override void Step(Pose[] poses, float scalar) { public override void Step(Pose[] poses, float scalar) {
pos = poses[0].position; pos = poses[0].position;
wrist = poses[1].position; Vec3 wrist = mono.Wrist(chirality).position;
shoulder = poses[2]; Pose shoulder = mono.Shoulder(chirality);
// just the yaw of the head Quaternion
// yaw = Input.Head.Forward; yaw.y = 0; yaw = yaw.Normalized;
// Quat q = Quat.LookDir(yaw);
Vec3 from = (shoulder.orientation * origin) + shoulder.position; Vec3 from = (shoulder.orientation * origin) + shoulder.position;
str = min + (scalar * max); str = min + (scalar * max);
@ -71,47 +55,34 @@ public class ReachCursor : SpatialCursor {
Vec3 dir = (pos - from).Normalized; Vec3 dir = (pos - from).Normalized;
p0 = pos + dir * stretch * str; p0 = pos + dir * stretch * str;
// model.Draw(Matrix.TS(p0, 0.1f));
// model.Draw(Matrix.TS(shoulder.position, 0.06f));
// Lines.Add(from, p0, Color.White, 0.005f);
Lines.Add(from, wrist, new Color(1, 0, 1), 0.005f); Lines.Add(from, wrist, new Color(1, 0, 1), 0.005f);
Lines.Add(pos, p0, new Color(0, 1, 1), 0.005f); Lines.Add(pos, p0, new Color(0, 1, 1), 0.005f);
// model.Draw(Matrix.TS(from, 0.04f));
// Pose mainHand = poses[0];
// Pose offHand = poses[1];
// Vec2 mid = Vec2.Lerp(lHand.position.XZ, rHand.position.XZ, 0.5f);
// Lines.Add(from, p0, Color.White, 0.005f);
// Vec3 calib = shoulder.orientation.Inverse * (pos - shoulder.position);
// if (calib.z > origin.z) {
// Calibrate();
// }
} }
public override void Calibrate() { public override void Calibrate() {
Vec3 wrist = mono.Wrist(chirality).position;
Pose shoulder = mono.Shoulder(chirality);
origin = shoulder.orientation.Inverse * (wrist - shoulder.position); origin = shoulder.orientation.Inverse * (wrist - shoulder.position);
} }
} }
public class TwistCursor : SpatialCursor { public class TwistCursor : SpatialCursor {
public TwistCursor() { Monolith mono;
bool chirality;
public TwistCursor(Monolith mono, bool chirality) {
this.mono = mono;
this.chirality = chirality;
this.min = 1f; this.min = 1f;
this.str = 6f; this.str = 6f;
this.max = 10f; this.max = 10f;
} }
Vec3 twistFrom = -Vec3.Right; Vec3 twistFrom = -Vec3.Right;
Quat quat;
public int chirality = 1;
public override void Step(Pose[] poses, float scalar) { public override void Step(Pose[] poses, float scalar) {
Vec3 pos = poses[0].position; Vec3 pos = poses[0].position;
quat = poses[0].orientation; Quat quat = mono.Con(chirality).aim.orientation;
Quat from = Quat.LookAt(Vec3.Zero, quat * Vec3.Forward, twistFrom); Quat from = Quat.LookAt(Vec3.Zero, quat * Vec3.Forward, twistFrom);
float twist = (float)(Math.Acos(Vec3.Dot(from * Vec3.Up, quat * Vec3.Up)) / Math.PI); float twist = (float)(Math.Acos(Vec3.Dot(from * Vec3.Up, quat * Vec3.Up)) / Math.PI);
outty = Vec3.Dot(from * Vec3.Up, quat * Vec3.Right * chirality) > 0; outty = Vec3.Dot(from * Vec3.Up, quat * Vec3.Right * (chirality ? 1 : -1)) > 0;
p0 = pos + quat * Vec3.Forward * twist * str; p0 = pos + quat * Vec3.Forward * twist * str;
// model.Draw(Matrix.TS(p0, 0.02f)); // model.Draw(Matrix.TS(p0, 0.02f));
@ -131,7 +102,7 @@ public class TwistCursor : SpatialCursor {
} }
} }
public override void Calibrate() { public override void Calibrate() {
Quat quat = mono.Con(chirality).aim.orientation;
twistFrom = quat * Vec3.Up; twistFrom = quat * Vec3.Up;
} }
@ -139,39 +110,40 @@ public class TwistCursor : SpatialCursor {
} }
public class CubicFlow : SpatialCursor { public class CubicFlow : SpatialCursor {
public CubicFlow() { Monolith mono;
TwistCursor domTwist;
TwistCursor subTwist;
public CubicFlow(Monolith mono) {
this.mono = mono;
this.min = 1f; this.min = 1f;
this.str = 3f; this.str = 3f;
this.max = 10f; this.max = 10f;
this.domTwist = new TwistCursor(mono, true);
this.subTwist = new TwistCursor(mono, false);
} }
TwistCursor domTwist = new TwistCursor();
TwistCursor subTwist = new TwistCursor();
bool domTwisting = false; bool domUp = false; bool domTwisting = false; bool domUp = false;
bool subTwisting = false; bool subUp = false; bool subTwisting = false; bool subUp = false;
public override void Step(Pose[] poses, float scalar) { public override void Step(Pose[] poses, float scalar) {
Pose dom = poses[0]; Pose dom = poses[0];
Pose sub = poses[1]; Pose sub = poses[1];
Controller domCon = Input.Controller(Handed.Right);
Controller subCon = Input.Controller(Handed.Left);
subTwist.chirality = -1;
if (domCon.stick.y < 0.1f) { if (mono.rCon.stick.y < 0.1f) {
domTwist.Calibrate(); domTwist.Calibrate();
domTwisting = false; domTwisting = false;
} else { } else {
if (!domTwisting) { if (!domTwisting) {
domUp = domCon.stick.x > 0; domUp = mono.rCon.stick.x > 0;
domTwisting = true; domTwisting = true;
} }
} }
domTwist.Step(new Pose[] { dom }, scalar); domTwist.Step(new Pose[] { dom }, scalar);
if (subCon.stick.y < 0.1f) { if (mono.lCon.stick.y < 0.1f) {
subTwist.Calibrate(); subTwist.Calibrate();
subTwisting = false; subTwisting = false;
} else { } else {
if (!subTwisting) { if (!subTwisting) {
subUp = subCon.stick.x < 0; subUp = mono.lCon.stick.x < 0;
subTwisting = true; subTwisting = true;
} }
} }