fix: Collision of wing geometry
This commit is contained in:
parent
a010baa099
commit
45213adda7
|
@ -41,7 +41,8 @@ import nhf.touhou.houjuu_nue.harness as MH
|
||||||
from nhf.parts.item import Item
|
from nhf.parts.item import Item
|
||||||
import nhf.utils
|
import nhf.utils
|
||||||
|
|
||||||
WING_DEFLECT = 10.0
|
WING_DEFLECT_ODD = 0.0
|
||||||
|
WING_DEFLECT_EVEN = 25.0
|
||||||
@dataclass
|
@dataclass
|
||||||
class Parameters(Model):
|
class Parameters(Model):
|
||||||
"""
|
"""
|
||||||
|
@ -52,23 +53,26 @@ class Parameters(Model):
|
||||||
|
|
||||||
wing_r1: MW.WingR = field(default_factory=lambda: MW.WingR(
|
wing_r1: MW.WingR = field(default_factory=lambda: MW.WingR(
|
||||||
name="r1",
|
name="r1",
|
||||||
shoulder_angle_bias = WING_DEFLECT,
|
shoulder_angle_bias = WING_DEFLECT_ODD,
|
||||||
s0_top_hole=False,
|
s0_top_hole=False,
|
||||||
s0_bot_hole=True,
|
s0_bot_hole=True,
|
||||||
|
arrow_height=350.0
|
||||||
))
|
))
|
||||||
wing_r2: MW.WingR = field(default_factory=lambda: MW.WingR(
|
wing_r2: MW.WingR = field(default_factory=lambda: MW.WingR(
|
||||||
name="r2",
|
name="r2",
|
||||||
|
shoulder_angle_bias = WING_DEFLECT_EVEN,
|
||||||
s0_top_hole=True,
|
s0_top_hole=True,
|
||||||
s0_bot_hole=True,
|
s0_bot_hole=True,
|
||||||
))
|
))
|
||||||
wing_r3: MW.WingR = field(default_factory=lambda: MW.WingR(
|
wing_r3: MW.WingR = field(default_factory=lambda: MW.WingR(
|
||||||
name="r3",
|
name="r3",
|
||||||
shoulder_angle_bias = WING_DEFLECT,
|
shoulder_angle_bias = WING_DEFLECT_ODD,
|
||||||
s0_top_hole=True,
|
s0_top_hole=True,
|
||||||
s0_bot_hole=False,
|
s0_bot_hole=False,
|
||||||
))
|
))
|
||||||
wing_l1: MW.WingL = field(default_factory=lambda: MW.WingL(
|
wing_l1: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
name="l1",
|
name="l1",
|
||||||
|
shoulder_angle_bias = WING_DEFLECT_EVEN,
|
||||||
wrist_angle=-60.0,
|
wrist_angle=-60.0,
|
||||||
s0_top_hole=False,
|
s0_top_hole=False,
|
||||||
s0_bot_hole=True,
|
s0_bot_hole=True,
|
||||||
|
@ -76,12 +80,13 @@ class Parameters(Model):
|
||||||
wing_l2: MW.WingL = field(default_factory=lambda: MW.WingL(
|
wing_l2: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
name="l2",
|
name="l2",
|
||||||
wrist_angle=-30.0,
|
wrist_angle=-30.0,
|
||||||
shoulder_angle_bias = WING_DEFLECT,
|
shoulder_angle_bias = WING_DEFLECT_ODD,
|
||||||
s0_top_hole=True,
|
s0_top_hole=True,
|
||||||
s0_bot_hole=True,
|
s0_bot_hole=True,
|
||||||
))
|
))
|
||||||
wing_l3: MW.WingL = field(default_factory=lambda: MW.WingL(
|
wing_l3: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
name="l3",
|
name="l3",
|
||||||
|
shoulder_angle_bias = WING_DEFLECT_EVEN,
|
||||||
wrist_angle=-0.0,
|
wrist_angle=-0.0,
|
||||||
s0_top_hole=True,
|
s0_top_hole=True,
|
||||||
s0_bot_hole=False,
|
s0_bot_hole=False,
|
||||||
|
|
|
@ -303,7 +303,7 @@ class ShoulderJoint(Model):
|
||||||
|
|
||||||
directrix_id: int = 0
|
directrix_id: int = 0
|
||||||
angle_neutral: float = -15.0
|
angle_neutral: float = -15.0
|
||||||
angle_max_deflection: float = 90.0
|
angle_max_deflection: float = 65.0
|
||||||
|
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
assert self.parent_lip_length * 2 < self.height
|
assert self.parent_lip_length * 2 < self.height
|
||||||
|
@ -1022,8 +1022,8 @@ class ElbowJoint(Model):
|
||||||
# Moves the hole to be some distance apart from 0
|
# Moves the hole to be some distance apart from 0
|
||||||
mount_r, mount_loc_angle, mount_parent_r = self.flexor.open_pos()
|
mount_r, mount_loc_angle, mount_parent_r = self.flexor.open_pos()
|
||||||
loc_span = Cq.Location.from2d(mount_r if child else mount_parent_r, 0)
|
loc_span = Cq.Location.from2d(mount_r if child else mount_parent_r, 0)
|
||||||
r = (-mount_loc_angle - self.angle_neutral if child else 0) + 180 + self.flexor_offset_angle
|
alpha = (-mount_loc_angle if child else 0) + 180 - self.flexor_offset_angle
|
||||||
loc_rot = Cq.Location.rot2d(r)
|
loc_rot = Cq.Location.rot2d(alpha)
|
||||||
loc = loc_rot * loc_span * loc_mount_orient * loc_mount
|
loc = loc_rot * loc_span * loc_mount_orient * loc_mount
|
||||||
return loc.flip_y() if self.flip and not child and not unflip else loc
|
return loc.flip_y() if self.flip and not child and not unflip else loc
|
||||||
|
|
||||||
|
@ -1062,14 +1062,17 @@ class ElbowJoint(Model):
|
||||||
Cq.Location((-lip_dz, 0, 0), (1, 0, 0), 90) *
|
Cq.Location((-lip_dz, 0, 0), (1, 0, 0), 90) *
|
||||||
Cq.Location((0, 0, 0), (0, 1, 0), 90)
|
Cq.Location((0, 0, 0), (0, 1, 0), 90)
|
||||||
)
|
)
|
||||||
|
loc_rot_neutral = Cq.Location.rot2d(self.angle_neutral)
|
||||||
loc_disk = flip_x * flip_z * Cq.Location((-self.child_arm_radius, 0, 0))
|
loc_disk = flip_x * flip_z * Cq.Location((-self.child_arm_radius, 0, 0))
|
||||||
loc_cut_rel = Cq.Location((0, self.disk_joint.spring.radius_inner, -self.disk_joint.disk_bot_thickness))
|
loc_cut_rel = Cq.Location((0, self.disk_joint.spring.radius_inner, -self.disk_joint.disk_bot_thickness))
|
||||||
disk_cut = self.disk_joint._disk_cut().located(
|
disk_cut = self.disk_joint._disk_cut().located(
|
||||||
loc_lip.inverse * loc_cut_rel * loc_disk)
|
loc_lip.inverse * loc_cut_rel * loc_disk)
|
||||||
result = (
|
result = (
|
||||||
Cq.Assembly()
|
Cq.Assembly()
|
||||||
.add(self.disk_joint.disk(), name="disk", loc=Cq.Location((0, 0, -dz), (0,0,1), angle))
|
.add(self.disk_joint.disk(), name="disk",
|
||||||
.add(self.lip().cut(disk_cut), name="lip", loc=loc_disk.inverse * loc_lip)
|
loc=loc_rot_neutral * Cq.Location((0, 0, -dz), (0,0,1), angle))
|
||||||
|
.add(self.lip().cut(disk_cut), name="lip",
|
||||||
|
loc=loc_rot_neutral * loc_disk.inverse * loc_lip)
|
||||||
)
|
)
|
||||||
# Orientes the hole surface so it faces +X
|
# Orientes the hole surface so it faces +X
|
||||||
loc_thickness = Cq.Location((-self.lip_thickness, 0, 0), (0, 1, 0), 90)
|
loc_thickness = Cq.Location((-self.lip_thickness, 0, 0), (0, 1, 0), 90)
|
||||||
|
@ -1136,12 +1139,12 @@ class ElbowJoint(Model):
|
||||||
result.add(
|
result.add(
|
||||||
self.actuator_mount(),
|
self.actuator_mount(),
|
||||||
name="act",
|
name="act",
|
||||||
loc=self.actuator_mount_loc(child=False) * loc_thickness)
|
loc=self.actuator_mount_loc(child=False, unflip=True) * loc_thickness)
|
||||||
else:
|
else:
|
||||||
result.add(
|
result.add(
|
||||||
Cq.Edge.makeLine((-1,0,0), (1,0,0)),
|
Cq.Edge.makeLine((-1,0,0), (1,0,0)),
|
||||||
name="act",
|
name="act",
|
||||||
loc=self.actuator_mount_loc(child=False))
|
loc=self.actuator_mount_loc(child=False, unflip=True))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@assembly()
|
@assembly()
|
||||||
|
|
|
@ -14,7 +14,12 @@ from nhf.parts.box import box_with_centre_holes, MountingBox, Hole
|
||||||
from nhf.parts.joints import HirthJoint
|
from nhf.parts.joints import HirthJoint
|
||||||
from nhf.parts.planar import extrude_with_markers
|
from nhf.parts.planar import extrude_with_markers
|
||||||
from nhf.touhou.houjuu_nue.joints import RootJoint, ShoulderJoint, ElbowJoint, DiskJoint
|
from nhf.touhou.houjuu_nue.joints import RootJoint, ShoulderJoint, ElbowJoint, DiskJoint
|
||||||
from nhf.touhou.houjuu_nue.electronics import LINEAR_ACTUATOR_21, LINEAR_ACTUATOR_50, ElectronicBoard
|
from nhf.touhou.houjuu_nue.electronics import (
|
||||||
|
LINEAR_ACTUATOR_10,
|
||||||
|
LINEAR_ACTUATOR_21,
|
||||||
|
LINEAR_ACTUATOR_50,
|
||||||
|
ElectronicBoard
|
||||||
|
)
|
||||||
import nhf.utils
|
import nhf.utils
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
|
@ -55,9 +60,9 @@ class WingProfile(Model):
|
||||||
movement_angle=55,
|
movement_angle=55,
|
||||||
),
|
),
|
||||||
hole_diam=4.0,
|
hole_diam=4.0,
|
||||||
angle_neutral=30.0,
|
angle_neutral=10.0,
|
||||||
actuator=LINEAR_ACTUATOR_50,
|
actuator=LINEAR_ACTUATOR_50,
|
||||||
flexor_offset_angle=0,
|
flexor_offset_angle=30,
|
||||||
flip=False,
|
flip=False,
|
||||||
))
|
))
|
||||||
# Distance between the two spacers on the elbow, halved
|
# Distance between the two spacers on the elbow, halved
|
||||||
|
@ -74,9 +79,9 @@ class WingProfile(Model):
|
||||||
child_arm_radius=23.0,
|
child_arm_radius=23.0,
|
||||||
parent_arm_radius=30.0,
|
parent_arm_radius=30.0,
|
||||||
hole_diam=4.0,
|
hole_diam=4.0,
|
||||||
angle_neutral=-30.0,
|
angle_neutral=0.0,
|
||||||
actuator=LINEAR_ACTUATOR_21,
|
actuator=LINEAR_ACTUATOR_10,
|
||||||
flexor_offset_angle=0,
|
flexor_offset_angle=30.0,
|
||||||
flip=True,
|
flip=True,
|
||||||
))
|
))
|
||||||
# Distance between the two spacers on the elbow, halved
|
# Distance between the two spacers on the elbow, halved
|
||||||
|
|
Loading…
Reference in New Issue