将shadertoy代码移植至cesium
·
export function init(viewer){
// const scene = viewer.scene;
// viewer.clock.currentTime.secondsOfDay = 65398;
// scene.globe.enableLighting = true;
// scene.fog.enabled = true;
// //定义盒子属性
// const destination = {
// x: -2280236.925141378,
// y: 5006991.049189922,
// z: 3215839.258024074,
// };
// const appearance = createMaterialAppearance();
// const primitive = createBoxPrimitive(destination, appearance,25);
creatAentit(viewer)
// viewer.scene.primitives.add(primitive);
// let lastTime = Date.now();
// scene.preRender.addEventListener(() => {
// const now = Date.now();
// appearance.material.uniforms.iTime += (now - lastTime) / 1000;
// lastTime = now;
// });
// viewer.camera.lookAt(
// destination,
// new Cesium.HeadingPitchRange(6.283185307179577, -0.4706003213405664, 100),
// );
}
// 创建一个实体盒子
function createBoxPrimitive(destination, appearance,boxSize) {
const boxGeometry = Cesium.BoxGeometry.fromDimensions({
dimensions: new Cesium.Cartesian3(boxSize, boxSize, boxSize),
});
const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(destination);
const boxInstance = new Cesium.GeometryInstance({
geometry: boxGeometry,
});
const primitive = new Cesium.Primitive({
geometryInstances: boxInstance,
appearance: appearance,
asynchronous: false,
modelMatrix: modelMatrix,
});
return primitive;
}
// 实体的材质
function createMaterialAppearance() {
const customMaterial = new Cesium.Material({
translucent: false,
fabric: {
type: "CustomBoxShader",
uniforms: {
iTime: 0.0,
iResolution: new Cesium.Cartesian2(1024, 1024),
},
// https://www.shadertoy.com/view/XXyGzh
source: `
uniform float iTime;
uniform vec2 iResolution;
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy*2.0-iResolution.xy;
vec4 o;
vec2 p ,c;
float a;
for(float i = 0.0;i<400.0;i++){
a= i/2e2-1.0;
p = cos(i*2.4+iTime+vec2(0,3.14/2.0))*sqrt(1.0-a*a);
c = uv/iResolution.y+vec2(p.x,a)/(p.y+2.0);
o+=(cos(i+vec4(0,2,4,0))+1.0)/dot(c,c)*(1.0-p.y)/3e4;
}
fragColor = o;
}
czm_material czm_getMaterial(czm_materialInput materialInput) {
czm_material material = czm_getDefaultMaterial(materialInput);
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
mainImage(color, materialInput.st * iResolution);
material.diffuse = color.rgb;
material.alpha = 1.0;//color.a;
return material;
}
`,
},
});
const appearance = new Cesium.MaterialAppearance({
material: customMaterial,
flat: false,
faceForward: true,
translucent: true,
closed: true,
materialCacheKey: "shadertoy-material-appearance",
});
return appearance;
}
//自定义的一个实体
function creatAentit(viewer){
// 设置初始视角
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(-122.4175, 37.655, 1000)
});
// 创建一个始终面向相机的平面
function createBillboardPlane(position, width, height) {
const geometry = new Cesium.PlaneGeometry({
dimensions: new Cesium.Cartesian2(width, height)
});
const instance = new Cesium.GeometryInstance({
geometry: geometry,
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.WHITE.withAlpha(0.8))
},
modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(position)
});
const appearance = new Cesium.MaterialAppearance({
material: Cesium.Material.fromType('Image', {
image: 'aa.jpg' // 替换为实际纹理数据或URL
}),
faceForward: true,
translucent: true
});
const primitive = new Cesium.Primitive({
geometryInstances: instance,
appearance: appearance
});
return primitive;
}
const planePosition = Cesium.Cartesian3.fromDegrees(-122.4175, 37.655, 10);
const planeWidth = 2000.0;
const planeHeight = 2000.0;
const planePrimitive = createBillboardPlane(planePosition, planeWidth, planeHeight);
viewer.scene.primitives.add(planePrimitive);
// 更新模型矩阵以使其始终面向相机
// 更新模型矩阵以使其始终面向相机
function updateModelMatrix() {
const camera = viewer.camera;
const position = Cesium.Matrix4.getTranslation(planePrimitive.geometryInstances.modelMatrix, new Cesium.Cartesian3());
const { right, up, direction } = camera;
// 通过相机的参数计算旋转矩阵
const rotation = Cesium.Matrix3.fromColumnMajorArray([
right.x, right.y, right.z,
up.x, up.y, up.z,
-direction.x, -direction.y, -direction.z
]);
// 获取 EastNorthUp 坐标系的变换矩阵
const enuMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position, viewer.scene.globe.ellipsoid);
// 将旋转四元数转换为旋转矩阵
const rotationMatrix = Cesium.Matrix4.fromRotation(rotation);
// 最终的模型矩阵 = EastNorthUp 矩阵 × 旋转矩阵
const modelMatrix = Cesium.Matrix4.multiply(
enuMatrix,
rotationMatrix,
new Cesium.Matrix4()
);
// 更新 primitive 的 modelMatrix
planePrimitive.geometryInstances.modelMatrix = modelMatrix;
}
// updateModelMatrix()
viewer.clock.onTick.addEventListener(updateModelMatrix);
// 添加鼠标交互事件
// let mousePosition = new Cesium.Cartesian2();
// viewer.canvas.addEventListener('mousemove', function(event) {
// mousePosition.x = event.clientX;
// mousePosition.y = event.clientY;
// });
// 在渲染循环中处理鼠标位置
// viewer.scene.postRender.addEventListener(function(scene, time) {
// const ray = viewer.camera.getPickRay(mousePosition);
// const position = scene.globe.pick(ray, viewer.scene.camera);
// if (position) {
// planePrimitive.geometryInstances.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position, viewer.scene.globe.ellipsoid);
// }
// });
}
更多推荐
所有评论(0)