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);
    //     }
    // });

}

更多推荐