Primitive繪制點(diǎn)線面

PrimitiveUtil.js代碼

class PrimitiveUtil {

    //畫(huà)點(diǎn)(componentsPerPositionAttribute必須為3)
    static addPrimitivePoints(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        for (let i = 0; i < pointNum; i++) {
            indicesTesm.push(i);
        }

        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);

        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.POINTS, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);

        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        });
        return viewer.scene.primitives.add(primitive);
    }
    
    //畫(huà)線(每2個(gè)頂點(diǎn)相連組成一條線)
    static addPrimitiveLines(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        for (let i = 0; i < pointNum; i++) {
            indicesTesm.push(i);
        }
    
        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);
    
        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.LINES, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);
    
        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        })
        return viewer.scene.primitives.add(primitive);
    }
    
    //畫(huà)線(所有的頂點(diǎn)前后相連組成一條線)
    static addPrimitiveLinesStrip(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        for (let i = 0; i < pointNum; i++) {
            indicesTesm.push(i);
        }
    
        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);
    
        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.LINE_STRIP, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);
    
        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        })
        return viewer.scene.primitives.add(primitive);
    }
    
    //畫(huà)線(所有的頂點(diǎn)前后相連組成一條閉合的線)
    static addPrimitiveLinesLoop(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        for (let i = 0; i < pointNum; i++) {
            indicesTesm.push(i);
        }
    
        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);
    
        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.LINE_LOOP, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);
    
        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        })
        return viewer.scene.primitives.add(primitive);
    }
    
    //畫(huà)三角形(每3個(gè)頂點(diǎn)相連組成一個(gè)三角形)
    static addPrimitiveTriangles(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        for (let i = 0; i < pointNum; i++) {
            indicesTesm.push(i);
        }
    
        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);
    
        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.TRIANGLES, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);
    
        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        })
        return viewer.scene.primitives.add(primitive);
    }
    
    //畫(huà)三角形(每個(gè)頂點(diǎn)和前面的一個(gè)頂點(diǎn),第一個(gè)頂點(diǎn)相連組成一個(gè)三角形)
    static addPrimitiveTrianglesFan(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        // let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        // for (let i = 2; i < pointNum; i++) {
        //  indicesTesm.push(0);
        //  indicesTesm.push(i-1);
        //  indicesTesm.push(i);
        // }
    
        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);
    
        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.TRIANGLE_FAN, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);
    
        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        })
        return viewer.scene.primitives.add(primitive);
    }
    
    //畫(huà)三角形(每個(gè)頂點(diǎn)和前面的兩個(gè)頂點(diǎn)相連組成一個(gè)三角形)
    static addPrimitiveTrianglesStrip(viewer, pointPositionArr, componentsPerPositionAttribute, pointColorArr, componentsPerColorAttribute) {
        let vertexShader = this.prototype.getVS();
        let fragmentShader = this.prototype.getFS();
        //頂點(diǎn)索引(坐標(biāo)點(diǎn)下標(biāo)的連接順序)
        let indicesTesm = [];
        // let pointNum = (pointPositionArr.length)/componentsPerPositionAttribute;
        // for (let i = 2; i < pointNum; i++) {
        //  indicesTesm.push(i-2);
        //  indicesTesm.push(i-1);
        //  indicesTesm.push(i);
        // }
    
        let positionArr = new Float64Array(pointPositionArr);
        let colorArr = new Float32Array(pointColorArr);
        let indiceArr = new Uint32Array(indicesTesm);
    
        let geometry = this.prototype.createGeometry(Cesium.PrimitiveType.TRIANGLE_STRIP, positionArr, componentsPerPositionAttribute, colorArr, componentsPerColorAttribute, indiceArr);
        let appearance = this.prototype.createAppearence(fragmentShader, vertexShader);
    
        let primitive =  new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: geometry
            }),
            appearance: appearance
        })
        return viewer.scene.primitives.add(primitive);
    }

    //創(chuàng)建Geometry
    createGeometry(primitiveType, positions, componentsPerPositionAttribute, colors, componentsPerColorAttribute, indices) {
        return new Cesium.Geometry({
            attributes: {
                position: new Cesium.GeometryAttribute({
                    componentDatatype: Cesium.ComponentDatatype.DOUBLE,
                    componentsPerAttribute: componentsPerPositionAttribute,
                    values: positions
                }),
                color: new Cesium.GeometryAttribute({
                    componentDatatype: Cesium.ComponentDatatype.FLOAT,
                    componentsPerAttribute: componentsPerColorAttribute,
                    values: colors
                })
            },
            indices: indices,
            primitiveType: primitiveType,
            boundingSphere: Cesium.BoundingSphere.fromVertices(positions)
        });
    }

    //創(chuàng)建Appearence
    createAppearence(fs, vs) {
        return new Cesium.Appearance({
            renderState: {
                blending: Cesium.BlendingState.PRE_MULTIPLIED_ALPHA_BLEND,
                depthTest: {
                    enabled: true
                },
                depthMask: true
            },
            fragmentShaderSource: fs,
            vertexShaderSource: vs
        });
    }
    
    //頂點(diǎn)著色器源碼
    getVS() {
        return "attribute vec3 position3DHigh;\
                attribute vec3 position3DLow;\
                attribute vec4 color;\
                varying vec4 v_color;\
                attribute float batchId;\
                void main()\
                {\
                    vec4 p = czm_computePosition();\
                    v_color = color;\
                    p = czm_modelViewProjectionRelativeToEye * p;\
                    gl_Position = p;\
                    gl_PointSize = 10.0;\
                }\
                ";
    }

    //片源著色器源碼
    getFS() {
        return "varying vec4 v_color;\
                void main()\
                {\
                     float d = distance(gl_PointCoord, vec2(0.5,0.5));\
                     if(d < 0.5){\
                        gl_FragColor = v_color;\
                     }else{\
                        discard;\
                     }\
                }\
                ";
    }
}

export default PrimitiveUtil

測(cè)試代碼

<template>
    <div id="cesiumContainer"></div>
</template>

<script>
    import CesiumUtil from '../../public/js/CesiumUtil.js'

    export default {
        name: 'CesiumViewer',
        components: {},
        data() {
            return {
                viewerFlag: false,
                maxR: 100000,
                r1: 0,

                leftDownFlag: false,
                pointDraged: null
            }
        },
        mounted() {
            let _this = this;

            let defaultRect = Cesium.Rectangle.fromDegrees(90, 20, 130, 50);
            Cesium.Camera.DEFAULT_VIEW_RECTANGLE = defaultRect;
            window.viewer = new Cesium.Viewer('cesiumContainer', {
                animation: false,
                shouldAnimate: true,
                baseLayerPicker: false,
                fullscreenButton: false,
                geocoder: false,
                homeButton: false,
                sceneModePicker: false,
                selectionIndicator: false,
                timeline: false,
                navigationHelpButton: false,
                infoBox: false,
                navigationInstructionsInitiallyVisible: false,
                imageryProvider: new Cesium.UrlTemplateImageryProvider({
                    url: "https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
                })
            });
            window.viewer.scene.debugShowFramesPerSecond = true;

            let p1 = Cesium.Cartesian3.fromDegrees(115.0, 37.0, 0);
            let p2 = Cesium.Cartesian3.fromDegrees(120.0, 37.0, 0);
            let p3 = Cesium.Cartesian3.fromDegrees(120.0, 40.0, 0);
            let p4 = Cesium.Cartesian3.fromDegrees(119.0, 42.0, 0);
            let pointArr2 = [p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, p3.x, p3.y, p3.z, p4.x, p4.y, p4.z];
            let colorArr = [1.0, 0.0, 0.0, 0.5, 
                            0.0, 1.0, 0.0, 0.5, 
                            0.0, 0.0, 1.0, 0.5,
                            1.0, 1.0, 0.0, 0.5
            ];
            let pPrimitives = CesiumUtil.primitive.addPrimitivePoints(window.viewer, pointArr2, 3, colorArr, 4);

            // let lPrimitives1 = CesiumUtil.primitive.addPrimitiveLines(window.viewer, pointArr2, 3, colorArr, 4);
            // let lPrimitives2 = CesiumUtil.primitive.addPrimitiveLinesStrip(window.viewer, pointArr2, 3, colorArr, 4);
            // let lPrimitives3 = CesiumUtil.primitive.addPrimitiveLinesLoop(window.viewer, pointArr2, 3, colorArr, 4);

            // let tPrimitives1 = CesiumUtil.primitive.addPrimitiveTriangles(window.viewer, pointArr2, 3, colorArr, 4);
            // let tPrimitives2 = CesiumUtil.primitive.addPrimitiveTrianglesFan(window.viewer, pointArr2, 3, colorArr, 4);
            // let tPrimitives3 = CesiumUtil.primitive.addPrimitiveTrianglesStrip(window.viewer, pointArr2, 3, colorArr, 4);
        },
        methods: {

        }
    }
</script>

<style scoped>
    #cesiumContainer {
        position: absolute;
        width: 100%;
        height: 100%;
    }
</style>

效果

image.png
image.png
image.png
image.png
image.png
image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子憨栽,更是在濱河造成了極大的恐慌爷辱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炉峰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)祷安,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兔乞,“玉大人汇鞭,你說(shuō)我怎么就攤上這事∮棺罚” “怎么了霍骄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)淡溯。 經(jīng)常有香客問(wèn)我读整,道長(zhǎng),這世上最難降的妖魔是什么咱娶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任米间,我火速辦了婚禮煎楣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘车伞。我一直安慰自己择懂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布另玖。 她就那樣靜靜地躺著困曙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谦去。 梳的紋絲不亂的頭發(fā)上慷丽,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音鳄哭,去河邊找鬼要糊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妆丘,可吹牛的內(nèi)容都是我干的锄俄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勺拣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奶赠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起药有,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毅戈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后愤惰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苇经,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年宦言,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扇单。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜡励,死狀恐怖令花,靈堂內(nèi)的尸體忽然破棺而出阻桅,到底是詐尸還是另有隱情凉倚,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布嫂沉,位于F島的核電站稽寒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趟章。R本人自食惡果不足惜杏糙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一慎王、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宏侍,春花似錦赖淤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绷耍,卻和暖如春吐限,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褂始。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诸典, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崎苗。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓狐粱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胆数。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脑奠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容