Kinesim/js/THREERobot.js

195 lines
5.4 KiB
JavaScript
Raw Normal View History

2024-10-03 06:42:49 +05:30
const THREERobot = function (V_initial, limits, scene) {
this.THREE = new THREE.Group()
this.robotBones = []
this.joints = []
const scope = this
let parentObject = this.THREE
// parentObject.rotation.x = Math.PI / 2
// let colors = [
// 0x05668D,
// 0x028090,
// 0x00A896,
// 0x02C39A,
// 0xF0F3BD,
// 0x0
// ]
const colors = [
0xaaaaaa,
0xbbbbbb,
0xbcbcbc,
0xcbcbcb,
0xcccccc,
0x0,
]
function createCube(x, y, z, w, h, d, min, max, jointNumber) {
const thicken = 1
const w_thickened = Math.abs(w) + thicken
const h_thickened = Math.abs(h) + thicken
const d_thickened = Math.abs(d) + thicken
const material = new THREE.MeshLambertMaterial({
color: colors[jointNumber],
})
const geometry = new THREE.CubeGeometry(w_thickened, h_thickened, d_thickened)
const mesh = new THREE.Mesh(geometry, material)
mesh.position.set(w / 2, h / 2, d / 2)
const group = new THREE.Object3D()
group.position.set(x, y, z)
group.add(mesh)
console.log(min, max)
// min = min / 180 * Math.PI
// max = max / 180 * Math.PI
const jointGeo1 = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, -min, 2 * Math.PI - max + min)
const jointGeoMax = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, -max, max)
const jointGeoMin = new THREE.CylinderGeometry(0.8, 0.8, 0.8 * 2, 32, 32, false, 0, -min)
const jointMesh1 = new THREE.Mesh(jointGeo1, new THREE.MeshBasicMaterial({
color: 0xffbb00,
}))
const jointMeshMax = new THREE.Mesh(jointGeoMax, new THREE.MeshBasicMaterial({
color: 0x009900,
}))
const jointMeshMin = new THREE.Mesh(jointGeoMin, new THREE.MeshBasicMaterial({
color: 0xdd2200,
}))
const joint = new THREE.Group()
// joint.add(jointMesh1, jointMesh2)
joint.add(jointMeshMax, jointMeshMin, jointMesh1)
scope.joints.push(joint)
switch (jointNumber) {
case 0:
joint.rotation.x = Math.PI / 2
break
case 1:
// joint.rotation.x = Math.PI / 2
break
case 2:
// joint.rotation.x = Math.PI / 2
break
case 3:
joint.rotation.z = Math.PI / 2
// joint.rotation.y = Math.PI
break
case 4:
// joint.rotation.x = Math.PI / 2
joint.rotation.y = Math.PI / 2
break
case 5:
joint.rotation.x = Math.PI / 2
group.rotation.y = Math.PI / 2
// group.rotation.z = Math.PI
// group.rotation.z = -Math.PI / 2
// group.rotation.y += Math.PI
// joint.rotation.z = +Math.PI / 2
// const axisHelper = new THREE.AxisHelper(3)
// axisHelper.rotation.x = Math.PI
// group.add(axisHelper)
const arrowZ = new THREE.ArrowHelper(new THREE.Vector3(0, 0, 1), new THREE.Vector3(0, 0, 0), 3, 0x0000ff)
arrowZ.line.material.linewidth = 4
group.add(arrowZ)
const arrowY = new THREE.ArrowHelper(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, 0, 0), 3, 0x00ff00)
arrowY.line.material.linewidth = 4
group.add(arrowY)
const arrowX = new THREE.ArrowHelper(new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 0, 0), 3, 0xff0000)
arrowX.line.material.linewidth = 4
group.add(arrowX)
// joint.add(getVectorArrow([0,0,0],[0,0,5]))
break
}
group.add(joint)
return group
}
let x = 0,
y = 0,
z = 0
V_initial.push([0, 0, 0]) // add a 6th pseudo link for 6 axis
for (let i = 0; i < V_initial.length; i++) {
const link = V_initial[i]
const linkGeo = createCube(x, y, z, link[0], link[1], link[2], limits[i][0], limits[i][1], i)
x = link[0]
y = link[1]
z = link[2]
console.log(link[0], link[1], link[2])
parentObject.add(linkGeo)
parentObject = linkGeo
this.robotBones.push(linkGeo)
}
scene.add(this.THREE)
this.angles = [0, 0, 0, 0, 0, 0]
}
THREERobot.prototype = {
setAngles(angles) {
this.angles = angles
this.robotBones[0].rotation.z = angles[0]
this.robotBones[1].rotation.y = angles[1]
this.robotBones[2].rotation.y = angles[2]
this.robotBones[3].rotation.x = angles[3]
this.robotBones[4].rotation.y = angles[4]
this.robotBones[5].rotation.z = angles[5]
},
setAngle(index, angle) {
this.angles[index] = angle
this.setAngles(this.angles)
},
highlightJoint(jointIndex, hexColor) {
if (jointIndex >= this.joints.length) {
console.warn(`cannot highlight joint: ${jointIndex} (out of index: ${this.joints.length})`)
}
if (hexColor) {
this._colorObjectAndChildren(this.joints[jointIndex], hexColor)
} else {
this._resetObjectAndChildrenColor(this.joints[jointIndex])
}
},
_colorObjectAndChildren(object, hexColor) {
const scope = this
object.traverse((node) => {
scope._colorObject(node, hexColor)
})
},
_colorObject(object, hexColor) {
if (object.material) {
if (!object.initalMaterial) {
object.initalMaterial = object.material
}
object.material = object.material.clone()
object.material.color.setHex(hexColor)
}
},
_resetObjectAndChildrenColor(object, hexColor) {
const scope = this
object.traverse((node) => {
scope._resetObjectColor(node)
})
},
_resetObjectColor(object) {
if (object.initalMaterial) {
object.material = object.initalMaterial
}
},
}