Skip to content

Instantly share code, notes, and snippets.

@lydonchandra
Created February 8, 2020 18:17
Show Gist options
  • Save lydonchandra/ea812ec87af9d313ea6869c27e993c93 to your computer and use it in GitHub Desktop.
Save lydonchandra/ea812ec87af9d313ea6869c27e993c93 to your computer and use it in GitHub Desktop.
triangleIntersection.js
var VisMan = Symbol.for("VisMan")
var cesiumViewer = () => {
return window[VisMan].cesiumViewer
}
var initCesiumViewer = () => {
if(window.viewer && window.viewer.state && window.viewer.state.viewer) {
window[VisMan].cesiumViewer = window.viewer.state.viewer
} else {
window[VisMan].cesiumViewer = findReactCesiumViewer("cesiumContainer-0")
}
return window[VisMan].cesiumViewer
}
var findReactCesiumViewer = (cesiumId) => {
let cesiumViewer = null
const el = document.getElementById(cesiumId)
for (let key in el) {
if (key.startsWith('__reactInternalInstance$')) {
const fiberNode = el[key];
if (fiberNode && fiberNode.return && fiberNode.return.memoizedState.next.memoizedState) {
cesiumViewer = fiberNode.return.memoizedState.next.memoizedState
}
break
}
}
return cesiumViewer
}
var Cartesian3 = Cesium.Cartesian3
var Matrix4 = Cesium.Matrix4
var removeGeometryInstances = () => {
let primitives = cesiumViewer().scene.primitives
for( let idx=primitives.length-1; idx >= 0 ; idx-- ) {
let primitive = cesiumViewer().scene.primitives.get( idx )
if( Object.keys(primitive).indexOf('geometryInstances') >= 0) {
cesiumViewer().scene.primitives.remove(primitive)
}
}
cesiumViewer().scene.requestRender()
}
var addTriangles = (positions) => {
var geometry = new Cesium.Geometry({
attributes: {
position: new Cesium.GeometryAttribute({
componentDatatype: Cesium.ComponentDatatype.DOUBLE, // not FLOAT
componentsPerAttribute: 3,
values: positions
}),
// normal: new Cesium.GeometryAttribute({
// componentDatatype: Cesium.ComponentDatatype.FLOAT,
// componentsPerAttribute: 3,
// values: normals
// })
},
// Don't need the following line if no vertices are shared.
//indices: new Uint32Array([0, 1, 2, 3, 4, 5]),
primitiveType: Cesium.PrimitiveType.TRIANGLES,
boundingSphere: Cesium.BoundingSphere.fromVertices(positions)
});
var triangleInstance = new Cesium.GeometryInstance({
geometry: geometry,
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED)
},
show: new Cesium.ShowGeometryInstanceAttribute(true)
});
cesiumViewer().scene.primitives.add(new Cesium.Primitive({
geometryInstances: [triangleInstance],
asynchronous: false,
appearance: new Cesium.PerInstanceColorAppearance({
closed: true,
translucent: false
})
}));
cesiumViewer().scene.requestRender()
}
var transformPoints = (points, transformMat4) => {
let out = new Float64Array( points.length )
for( let idx=0; idx<points.length; idx+=3 ) {
let x = points[idx]
let y = points[idx+1]
let z = points[idx+2]
let cart3 = new Cartesian3(x, y, z)
let transformed = Matrix4.multiplyByPoint( transformMat4, cart3, new Cartesian3 )
out[idx] = transformed.x
out[idx+1] = transformed.y
out[idx+2] = transformed.z
}
return out
}
initCesiumViewer()
removeGeometryInstances()
cesiumViewer().scene.requestRender()
var transformMat4 = cesiumViewer().scene._primitives._primitives[2].root.transform
var triPoints_modelSpace = [
0,10,20, 60,60,60, 10,10,60,
0,0,20, 60,-60,60, 10,-10,60 ]
var transformed = transformPoints( triPoints_modelSpace, transformMat4 )
console.log(transformed)
addTriangles(transformed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment