Hi, I am trying to create an application where I load a GLTF model on screen using AFrame and am using Orbit Controls to pan, rotate and zoom it. When I click on any part of model, it should get isolated( only that part should be visible all others should disappear) and the camera should now focus on that part and Orbit Controls target should also change.
One approach I tried was -
For isolation : Traverse through nodes. if node.name != clicked part name then make that node’s material transparent and reduce its scale to 0.05 so that it doesn’t take clicks.
For focus: Instead of changing camera position I scaled and trying to center the isolated part. (Centering mesh isn’t working though)
This is something i use in my project for focusing a obj
public focusSelected() {
// If there is no selected obj -> return
if(!this.selected) return
// Calc screen ratio
let ratio = SceneSetup.w / SceneSetup.h // Canvas width/height
// Calc dimension and center position of selected obj
let dimension = new THREE.Vector3()
let center = new THREE.Vector3()
let bbox = new THREE.Box3().setFromObject(this.selected)
bbox.getSize(dimension)
bbox.getCenter(center)
let objWidth = dimension.x
let objHeight = dimension.y
// Adding some minimum height
if(objHeight < 2)
objHeight = 2
// Calculate distances for width and height
let distanceW = objWidth / 2 / ratio / Math.tan(Math.PI * camera.fov / 360)
let distanceH = objHeight / 2 / ratio / Math.tan(Math.PI * camera.fov / 360)
let distance = Math.max(distanceW, distanceH)
// Add depth of selected obj
distance += dimension.z
// store position of selected obj
let vec = selected.position.clone()
// Calc direction of selected obj
let direction = new THREE.Vector3()
this.selected.getWorldDirection(direction)
// Normalize direction to numbers between 0 and 1
direction.normalize()
// multiply distance to all normalized values
direction.multiplyScalar(distance)
let pos = new THREE.Vector3()
// Add direction to selected position
pos = vec.add(direction)
// Set orbits camera.position to calculated position
this.orbit.object.position.copy(pos)
// Set orbits target to selected center
this.orbit.target.copy(center)
this.orbit.update()
}
this.orbit.object.position.copy(pos)
// Set orbits target to selected center
this.orbit.target.copy(center)
this.orbit.update()
How to access orbit-controls attribute of camera in A-Frame?
I tried the following but getAttribute returns nothing :
var OrbitCtrls = entity_camera.getAttribute(“camera”,“orbit-controls”);
// Set orbits camera.position to calculated position
OrbitCtrls.object3D.position.copy(pos);
// Set orbits target to selected center
OrbitCtrls.object3D.target.copy(center);
OrbitCtrls.object3D.update();
I never used A-Frame, but i guess you have a camera stored in some variable as well?
Instead of using the orbitCtrls reference of camera, use the camera itself.
So instead of orbitCtrl.object.position.copy(pos) use camera.position.copy(pos)
Just a query. Can I create/initialize a new entity/object as the GLTF model child mesh.
When i traverse through my child meshes can I instantiate one of the child meshhes as a new object?
If so please guide me how?