一些技术路线测试,增加git,方便代码还原
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<!doctype html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cesium.com/downloads/cesiumjs/releases/1.132/Build/Cesium/Cesium.js"></script>
    <link href="https://cesium.com/downloads/cesiumjs/releases/1.132/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
 
    <style>
        * {
            margin: 0;
            padding: 0;
        }
 
        html,
        body {
            width: 100%;
            height: 100%;
            overflow: hidden;
        }
 
        .viewer-container {
            width: 100%;
            height: 100%;
            overflow: hidden;
        }
 
        #trailer {
            position: absolute;
            z-index: 10;
 
        }
    </style>
</head>
 
<body>
    <div id="viewer-container" class="viewer-container">
        <video id="trailer" muted="" autoplay="" loop="" crossorigin="" controls="">
            <source src="https://cesium.com/public/SandcastleSampleData/big-buck-bunny_trailer.webm" type="video/webm">
            <source src="https://cesium.com/public/SandcastleSampleData/big-buck-bunny_trailer.mp4" type="video/mp4">
            <source src="https://cesium.com/public/SandcastleSampleData/big-buck-bunny_trailer.mov"
                type="video/quicktime">
            Your browser does not support the <code>video</code> element.
        </video>
    </div>
    <script>
        const viewer = new Cesium.CesiumWidget("viewer-container")
        let cameraPosition = Cesium.Cartesian3.fromDegrees(120, 31, 2000)
 
 
 
        let heading = 0
        let pitch = -180
        let hpr = Cesium.HeadingPitchRoll.fromDegrees(0, pitch, 0)
 
        function computeFarCenter (position, hpr, far) {
            const quaternion = Cesium.Transforms.headingPitchRollQuaternion(position, hpr)
            const rotMat = Cesium.Matrix3.fromQuaternion(quaternion)
            const dirLocal = new Cesium.Cartesian3(0, 0, far)
            const dirWorld = Cesium.Matrix3.multiplyByVector(rotMat, dirLocal, new Cesium.Cartesian3())
            return Cesium.Cartesian3.add(position, dirWorld, new Cesium.Cartesian3())
        }
 
        const far = 1000
        const fov = 60
        const aspectRatio = 16 / 9
        let orientation = Cesium.Transforms.headingPitchRollQuaternion(cameraPosition, hpr)
 
        function createFrustumPrimitive (position, orientation, aspectRatio, fov, far) {
            const frustum = new Cesium.PerspectiveFrustum({
                fov: Cesium.Math.toRadians(fov),
                aspectRatio,
                far,
                near: 1.0,
 
            })
            const frustumGeometry = new Cesium.FrustumOutlineGeometry({
                frustum: frustum,
                origin: position,
                orientation: orientation,
                vertexFormat: Cesium.VertexFormat.POSITION_ONLY
            })
            const geometryInstance = new Cesium.GeometryInstance({
                geometry: frustumGeometry,
                attributes: {
                    color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.YELLOW.withAlpha(0.5))
                }
            })
            return new Cesium.Primitive({
                geometryInstances: geometryInstance,
                appearance: new Cesium.PerInstanceColorAppearance({
                    flat: true,
                    translucent: true
                }),
                asynchronous: false
            })
        }
 
        let primitive = createFrustumPrimitive(cameraPosition, orientation, aspectRatio, fov, far)
        viewer.scene.primitives.add(primitive)
 
        let width = far * Math.tan(Cesium.Math.toRadians(fov) * 0.5) * 2
        let height = width / aspectRatio
 
        viewer.entities.add({
            position: new Cesium.CallbackProperty(() => {
                return computeFarCenter(cameraPosition, hpr, 1000)
            }, false),
            orientation: new Cesium.CallbackProperty(() => {
                return orientation
            }, false),
            plane: {
                plane: new Cesium.Plane(new Cesium.Cartesian3(0, 0, -1), 0),
                dimensions: new Cesium.Cartesian2(width, height),
                material: document.getElementById("trailer"),
            },
        })
 
        // setInterval(() => {
        //     heading += -5
        //     if (heading < -360) {
        //         heading = 0
        //     }
 
        //     pitch += 5
        //     if (pitch > 0) {
        //         pitch = -180
        //     }
 
        //     hpr = Cesium.HeadingPitchRoll.fromDegrees(heading, pitch, 0)
        //     orientation = Cesium.Transforms.headingPitchRollQuaternion(cameraPosition, hpr)
        //     primitive && primitive.destroy()
        //     primitive = createFrustumPrimitive(cameraPosition, orientation, aspectRatio, fov, far)
        //     viewer.scene.primitives.add(primitive)
        // }, 100)
 
 
        // 飞到该视椎体
        viewer.flyTo(viewer.entities)
 
 
 
 
    </script>
</body>
 
</html>