wrangle in the cursors

This commit is contained in:
spatialfree 2021-11-29 06:36:02 -05:00
parent f5c031eba8
commit 39c00e1dd1
2 changed files with 139 additions and 108 deletions

View file

@ -18,20 +18,17 @@ class Program {
public class Mono {
public Mic mic;
public Controller offHand, mainHand;
public Controller lHand, rHand;
public void Run() {
// mic = new Mic();
Vec3 pos = new Vec3(0, 0, 0);
Cursors cursors = new Cursors();
MonoNet net = new MonoNet(this);
net.Start();
// StretchCursor stretchCursor = new StretchCursor();
CubicFlow cubicFlow = new CubicFlow();
// ReachCursor reachCursor = new ReachCursor();
// SupineCursor supineCursor = new SupineCursor();
// ClawCursor clawCursor = new ClawCursor();
Oriel oriel = new Oriel();
oriel.Start();
@ -40,23 +37,25 @@ public class Mono {
// OrbitalView.distance = 0.4f;
// cube.thickness = 0.01f;
// Lerper lerper = new Lerper();
while (SK.Step(() => {
offHand = Input.Controller(Handed.Left);
mainHand = Input.Controller(Handed.Right);
// mainHand.aim = Input.Hand(Handed.Right).palm;
lHand = Input.Controller(Handed.Left);
rHand = Input.Controller(Handed.Right);
cubicFlow.Step(offHand.aim, mainHand.aim);
cubicFlow.DrawSelf();
net.me.cursorA = cubicFlow.p0;
net.me.cursorB = cubicFlow.p1;
net.me.cursorC = cubicFlow.p2;
net.me.cursorD = cubicFlow.p3;
SpatialCursor cursor = cursors.Step(lHand.aim, rHand.aim);
if (lHand.IsX1JustPressed) {
pos = new Vec3(0, 0, 0);
}
// pos.x = (float)Math.Sin(Time.Total * 0.1f) * 0.5f;
Renderer.CameraRoot = Matrix.T(pos);
// cursor.Step(lHand.aim, rHand.aim); cursor.DrawSelf();
// net.me.cursorA = Vec3.Up * (float)Math.Sin(Time.Total);
net.me.cursorA = cursor.p0; net.me.cursorB = cursor.p1;
net.me.cursorC = cursor.p2; net.me.cursorD = cursor.p3;
net.me.headset = Input.Head;
net.me.offHand = offHand.aim;
net.me.mainHand = mainHand.aim;
net.me.offHand = lHand.aim; net.me.mainHand = rHand.aim;
for (int i = 0; i < net.peers.Length; i++) {
MonoNet.Peer peer = net.peers[i];
if (peer != null) {
@ -64,37 +63,16 @@ public class Mono {
net.Cubee(peer.headset.ToMatrix(Vec3.One * 0.3f));
net.Cubee(peer.offHand.ToMatrix(Vec3.One * 0.1f));
net.Cubee(peer.mainHand.ToMatrix(Vec3.One * 0.1f));
cubicFlow.Draw(peer.cursorA, peer.cursorB, peer.cursorC, peer.cursorD);
// cubicFlow.Draw(peer.cursorA, peer.cursorB, peer.cursorC, peer.cursorD);
}
}
oriel.Step();
// domHand subHand ?? :3
// if (offHand.trigger.) {
// lerper.t = 0;
// }
// lerper.Step(1, false);
// Console.WriteLine(lerper.t);
// Matrix orbitMatrix = OrbitalView.transform;
// cube.Step(Matrix.S(Vec3.One * 0.2f) * orbitMatrix);
// Default.MaterialHand["color"] = cube.color;
// reachCursor.Step();
// supineCursor.Step(
// new Pose(Vec3.Zero, offHand.aim.orientation),
// new Pose(mainHand.aim.position, mainHand.aim.orientation),
// mainHand.IsStickClicked
// );
// clawCursor.Step(
// Input.Head.position - Vec3.Up * 0.2f,
// new Pose(offHand.aim.position, offHand.aim.orientation),
// new Pose(mainHand.aim.position, mainHand.aim.orientation),
// mainHand.IsStickClicked
// );
// cursor.Draw(Matrix.S(0.1f));
})) ;
SK.Shutdown();

View file

@ -3,66 +3,109 @@ using StereoKit;
// build this out tentatively
public abstract class SpatialCursor {
public Vec3 pos;
public Quat rot;
public Vec3 p0, p1, p2, p3;
public float min, str, max;
public static Model model = Model.FromFile("cursor.glb", Shader.Default);
public Model model = Model.FromFile("cursor.glb", Shader.Default);
public abstract void Step(Pose[] poses);
public abstract void Calibrate();
}
public class Cursors {
SpatialCursor[] oneHanded = new SpatialCursor[] { new ReachCursor(), new TwistCursor() }; int oneIndex = 0;
SpatialCursor[] twoHanded = new SpatialCursor[] { new StretchCursor(), new CubicFlow(), new SupineCursor() }; int twoIndex = 0;
public SpatialCursor Step(Pose lHand, Pose rHand) {
Pose domHand = rHand; Pose subHand = lHand;
SpatialCursor cursor = oneHanded[oneIndex];
cursor.Step(new Pose[] { domHand, subHand });
return cursor;
}
}
public class StretchCursor : SpatialCursor {
public void Step(Pose offPose, Pose mainPose) {
float stretch = (offPose.position - mainPose.position).Magnitude;
stretch = Math.Max(stretch - 0.1f, 0);
pos = mainPose.position + mainPose.Forward * stretch * 3;
model.Draw(Matrix.TS(pos, 0.06f));
public StretchCursor() {
this.min = 1f;
this.str = 3f;
this.max = 10f;
}
public override void Step(Pose[] poses) {
Pose dom = poses[0];
Pose sub = poses[1];
float stretch = (sub.position - dom.position).Magnitude;
stretch = Math.Max(stretch - 0.1f, 0);
p0 = dom.position + dom.Forward * stretch * 3;
model.Draw(Matrix.TS(p0, 0.06f));
}
public override void Calibrate() {}
}
// this is just a stretch cursor derivative
public class ReachCursor : SpatialCursor {
static Vec3 origin;
public void Step(Vec3 mainPos, bool calibrate) {
float stretch = (origin - mainPos).Length;
Vec3 dir = (mainPos - origin).Normalized;
Vec3 pos = mainPos + dir * stretch * 3;
public ReachCursor() {
this.min = 1f;
this.str = 3f;
this.max = 10f;
}
Vec3 pos;
Vec3 origin;
public override void Step(Pose[] poses) {
pos = poses[0].position;
float stretch = (origin - pos).Length;
Vec3 dir = (pos - origin).Normalized;
p0 = pos + dir * stretch * 3;
model.Draw(Matrix.TS(pos, 0.06f));
Lines.Add(origin, pos, Color.White, 0.01f);
model.Draw(Matrix.TS(origin, 0.04f));
if (calibrate) {
origin = mainPos;
}
public override void Calibrate() {
origin = pos;
}
}
public class TwistCursor : SpatialCursor {
public void Step(Vec3 mainPos, Quat mainQuat, float str = 1) {
Quat rel = Quat.LookAt(Vec3.Zero, mainQuat * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, mainQuat * Vec3.Up) + 1) / 2;
pos = mainPos + mainQuat * Vec3.Forward * twist * str;
model.Draw(Matrix.TS(pos, 0.02f));
public TwistCursor() {
this.min = 1f;
this.str = 3f;
this.max = 10f;
}
public override void Step(Pose[] poses) {
Vec3 pos = poses[0].position;
Quat quat = poses[0].orientation;
Quat rel = Quat.LookAt(Vec3.Zero, quat * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, quat * Vec3.Up) + 1) / 2;
p0 = pos + quat * Vec3.Forward * twist * str;
model.Draw(Matrix.TS(p0, 0.02f));
}
public override void Calibrate() { }
}
public class CubicFlow {
public Vec3 p0, p1, p2, p3;
public TwistCursor offTwist = new TwistCursor();
public TwistCursor mainTwist = new TwistCursor();
public void Step(Pose offPose, Pose mainPose) {
offTwist.Step(offPose.position, offPose.orientation, 3);
mainTwist.Step(mainPose.position, mainPose.orientation, 3);
public class CubicFlow : SpatialCursor {
public CubicFlow() {
this.min = 1f;
this.str = 3f;
this.max = 10f;
}
TwistCursor domTwist = new TwistCursor();
TwistCursor subTwist = new TwistCursor();
public override void Step(Pose[] poses) {
Pose dom = poses[0];
Pose sub = poses[1];
domTwist.Step(new Pose[] { dom });
subTwist.Step(new Pose[] { sub });
p0 = offPose.position;
p1 = offTwist.pos;
p2 = mainTwist.pos;
p3 = mainPose.position;
p0 = dom.position;
p1 = domTwist.p0;
p2 = subTwist.p0;
p3 = sub.position;
// if toggle
}
public void DrawSelf() {
Draw(this.p0, this.p1, this.p2, this.p3);
}
@ -78,47 +121,57 @@ public class CubicFlow {
}
Lines.Add(bezier);
}
public override void Calibrate() {}
}
// a more symmetrical one would be cool
public class SupineCursor : SpatialCursor {
public SupineCursor() {
// this.min = 1f;
// this.str = 3f;
// this.max = 10f;
}
float calibStr;
Quat calibQuat;
public void Step(Pose offPose, Pose mainPose, bool calibrate) {
Quat rel = Quat.LookAt(Vec3.Zero, offPose.orientation * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, offPose.orientation * Vec3.Up) + 1) / 2;
Pose dom, sub;
public override void Step(Pose[] poses) {
dom = poses[0];
sub = poses[1];
pos = mainPose.position + mainPose.orientation * calibQuat * Vec3.Forward * calibStr * twist;
Quat rel = Quat.LookAt(Vec3.Zero, sub.orientation * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, sub.orientation * Vec3.Up) + 1) / 2;
p0 = dom.position + dom.orientation * calibQuat * Vec3.Forward * calibStr * twist;
if (calibrate) {
Vec3 target = Input.Head.position + Input.Head.Forward;
calibStr = Vec3.Distance(mainPose.position, target) * 2;
Quat calibAlign = Quat.LookAt(mainPose.position, target);
calibQuat = mainPose.orientation.Inverse * calibAlign;
model.Draw(Matrix.TS(p0, 0.06f));
}
public override void Calibrate() {
Vec3 target = Input.Head.position + Input.Head.Forward;
calibStr = Vec3.Distance(dom.position, target) * 2;
model.Draw(Matrix.TS(pos, 0.06f));
Quat calibAlign = Quat.LookAt(dom.position, target);
calibQuat = dom.orientation.Inverse * calibAlign;
}
}
// for fun
public class ClawCursor : SpatialCursor {
Quat calibOff, calibMain;
public void Step(Vec3 chest, Pose offPose, Pose mainPose, bool calibrate) {
float wingspan = 0.5f;
Quat offQuat = calibOff * offPose.orientation;
Quat mainQuat = calibMain * mainPose.orientation;
Vec3 elbow = chest + mainQuat * mainQuat * Vec3.Forward * wingspan;
pos = elbow + offQuat * offQuat * Vec3.Forward * wingspan;
// public class ClawCursor : SpatialCursor {
if (calibrate) {
calibOff = offPose.orientation.Inverse;
calibMain = mainPose.orientation.Inverse;
}
// Quat calibOff, calibMain;
// public void Step(Vec3 chest, Pose offPose, Pose mainPose, bool calibrate) {
// float wingspan = 0.5f;
// Quat offQuat = calibOff * offPose.orientation;
// Quat mainQuat = calibMain * mainPose.orientation;
// Vec3 elbow = chest + mainQuat * mainQuat * Vec3.Forward * wingspan;
// p0 = elbow + offQuat * offQuat * Vec3.Forward * wingspan;
Lines.Add(chest, elbow, Color.White, 0.01f);
Lines.Add(elbow, pos, Color.White, 0.01f);
model.Draw(Matrix.TS(pos, 0.06f));
}
}
// if (calibrate) {
// calibOff = offPose.orientation.Inverse;
// calibMain = mainPose.orientation.Inverse;
// }
// Lines.Add(chest, elbow, Color.White, 0.01f);
// Lines.Add(elbow, p0, Color.White, 0.01f);
// model.Draw(Matrix.TS(p0, 0.06f));
// }
// }