194 lines
5.4 KiB
JavaScript
194 lines
5.4 KiB
JavaScript
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
|
|
}
|
|
},
|
|
|
|
}
|