🍀Three编辑器 - 内核 
npm install three-editor-cores
THREE.js 0.157.0
引入
import { ThreeEditor } from 'three-editor-cores'
const { ThreeEditor } = require('three-editor-cores')
设置draco 解码器路径
ThreeEditor.dracoPath = '/draco/'
js 技巧
let originalAdd = scene.add
scene.add = function (object) {
originalAdd.apply(scene, arguments)
}
创建场景
const ThreeEditor = new ThreeEditor({
threeBoxRef: document.querySelector('#threeBox'),
rendererParams: {
fps: null,
pixelRatio: window.devicePixelRatio * 1,
webglRenderParams: { antialias: true, alpha: true, logarithmicDepthBuffer: true },
userPermissions: { autoPlace: true, proxy: false }
},
sceneParams: JSON.parse(localStorage.getItem('sceneParams')),
meshListParams: JSON.parse(localStorage.getItem('meshListParams')),
skyParams: JSON.parse(localStorage.getItem('skyParams')),
saveEditorCallBack: (sceneParams, meshListParams) => {
localStorage.setItem('sceneParams', JSON.stringify(sceneParams))
localStorage.setItem('meshListParams', JSON.stringify(meshListParams))
}
})
threeEditor.viewer
threeEditor.progressList
threeEditor.progressList.forEach(i => i.loaderService.progress = e => yourCallBack(e))
销毁场景
threeEditor.viewer.destroySceneRender()
适配屏幕
window.onresize = () => threeEditor.viewer.renderSceneResize()
viewer 下属性
transformControls.dragChangeCallback = (v) => {}
chartsMapControls.geoGroupLoadCall = (group) => {}
chartsMapControls.geoGroupAllLoadedCall = () => {}
API
threeEditor.getSceneEvent(e, (info) => ())
threeEditor.getRawSceneEvent(e, group)
const { loaderService, rootInfo } = threeEditor.setModelFromInfo({ type: 'GLTF', url: 'HOST/yCar.glb' })
loaderService.progress = e => console.log(e)
loaderService.complete = (model) => console.log('加载完成')
threeEditor.setSky(urls)
threeEditor.setGlobalEnvBackground(urls)
const mesh = threeEditor.setCss2dDOM(document.querySelector('#your_dom'),point)
mesh.destroy()
const mesh = threeEditor.setCss3dDOM(document.querySelector('#your_dom'),point)
mesh.destroy()
threeEditor.getDistanceScalePoint(camera.position, info.point, 0.5)
threeEditor.setGsapAnimation(vector3, vector3_, gsapQuery)
threeEditor.setGUIDomPosition(DOM)
threeEditor.setOutlinePass([model])
threeEditor.saveSceneEditor()
threeEditor.refreshGUI()
threeEditor.getSceneEditorImage(params)
threeEditor.setSceneControlMode(mode)
threeEditor.setTransformControlsProperty('showX', false)
threeEditor.setOperateOption('stats', Math.random() > 0.5 ? true : false)
const model = threeEditor.viewer.currentInfo?.currentRootModel
const _actions = Math.random() > 0.5 ? [1, 3, 5, 7] : [2, 4, 6, 8]
model.animationPlayParams.actionIndexs.forEach((_, k, arr) => arr[k] = _actions.includes(k))
const { mixer, actions } = threeEditor.setModelAnimationPlay(model)
mixer.addEventListener('finished', (e) => console.log(123))
threeEditor.removeModelAnimation(mesh)
threeEditor.setBoxGeometry(size, color)
group.children.forEach(i => {
if (i.geoInfo?.properties?.centerCoord3) {
const mesh = threeEditor.setBoxGeometry(10, 'red')
mesh.position.copy(getTransformedVector(i.geoInfo?.properties.centerCoord3))
threeEditor.viewer.scene.add(mesh)
}
})
threeEditor.changeMeshMaterial(group, params)
threeEditor.changeMeshTransform(group, params)
let currnetMeshName = null
let meshs = []
threeEditor.viewer.chartsMapControls.geoGroupLoadCall = (group) => {
if (group.name !== '带事件') return
const { raycaster, getIntersects } = threeEditor.getRawSceneEvent()
raycaster.far = 1000
document.querySelector('#threeBox').addEventListener('mousemove', (e) => {
const intersects = getIntersects(e, group.children)
const i = intersects.find((i) => i.object.text !== 'TransformControls' && i.object.isMesh)
if (!i) return
if (currnetMeshName === i.object.name) return
currnetMeshName = i.object.name
meshs.forEach(i => {
i?.meshRevertMaterial()
i?.meshRevertTransform()
})
meshs = group.children.filter(j => j.name === i.object.name)
meshs.forEach(i => {
threeEditor.changeMeshTransform(i, { scale: { x: 1, y: 1, z: 3 } })
threeEditor.changeMeshMaterial(i, { color: 'blue', opacity: 1 })
})
})
}
threeEditor.pointSyncTransform(point, mesh)
threeEditor.getSceneCurveList()
threeEditor.setCurveAnimation(curve, 1)
const { mesh, path } = threeEditor.getSceneCurveList()[0]
const curveAnimate = threeEditor.setCurveAnimation(path, 1)
const mesh1 = threeEditor.viewer.scene.getObjectByName('运动')
curveAnimate.frameCallback = p => {
mesh1.position.copy(
threeEditor.pointSyncTransform(p, mesh)
)
}
curveAnimate.start()
const mesh = threeEditor.viewer.scene.getObjectByName('大楼')
const { transformAnimationList } = mesh
transformAnimationList.forEach((i, k) => {
setTimeout(() => {
i.gsapParams.query.onUpdate = () => { }
threeEditor.setGsapMeshAction(mesh, i._transformInfo, i.transformInfo_, i.gsapParams)
}, k * 2000)
})
threeEditor.getBestViewTarget(model, scale)
threeEditor.getObjectViews(object)
threeEditor.setSceneFromClassify(['#1'])
const { camera, controls } = threeEditor.viewer
const [end, start] = controls.viewAngleList
setGsapAnimationLook(start).then(() => {
threeEditor.setSceneFromClassify(['场景2'])
threeEditor.setSky([])
setGsapAnimationLook(end)
})
function setGsapAnimationLook(viewAngle) {
return Promise.all([
new Promise((resolve) => {
threeEditor.setGsapAnimation(camera.position, viewAngle.position, { duration: 2, onComplete: resolve })
}),
new Promise((resolve) => {
threeEditor.setGsapAnimation(controls.target, viewAngle.target, { duration: 2, onComplete: resolve })
})
])
}
threeEditor.meshGroupCloneMaterial(mesh/group)
createSkySphereShader({ materialType })
createScanPlane({ materialType, url })
getLight('PointLight')