欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Cesium三維模型拖拽變換:平移、旋轉(zhuǎn)與縮放完整實現(xiàn)思路

Cesium三維模型拖拽變換:平移、旋轉(zhuǎn)與縮放完整實現(xiàn)思路 做三維 GIS 項目時最常被問到的需求之一就是“這個模型能不能直接用鼠標拖一下”包括拖拽移動、旋轉(zhuǎn)朝向、縮放大小。很多新手會被 Cesium 的坐標體系和事件機制勸退一查資料發(fā)現(xiàn)要么是只講加載模型要么是貼一段 200 行的代碼卻完全沒講為什么。這篇文章會從模型交互相關(guān)的核心概念講起結(jié)合完整的可運行示例把三維模型的拖拽、旋轉(zhuǎn)、縮放思路完整拆開幫你在自己的項目里快速落地。如果你正在折騰 Cesium 模型交互、模型姿態(tài)控制或場景編輯功能這篇文章會比較適合你。1. 背景與核心概念1.1 為什么需要拖拽變換在 Web GIS 項目里模型不只是用來“看”的。城市規(guī)劃場景中需要把建筑模型擺放到指定位置園區(qū)管理系統(tǒng)中需要調(diào)整設(shè)備模型的方向來匹配實際朝向數(shù)字孿生項目中操作員經(jīng)常要實時調(diào)整模型的位置和姿態(tài)。如果這些操作都靠輸入坐標參數(shù)來改體驗會非常差也很難在演示場景里快速完成調(diào)整。拖拽變換解決的問題非常直接用鼠標選中一個模型按住拖動改變位置通過快捷鍵或滾輪調(diào)整旋轉(zhuǎn)角度和縮放比例整個過程所見即所得。這就是三維場景中非常典型的“交互式模型編輯”能力。如果只講概念可能還是有點抽象我們先明確一下本文所說的“拖拽變換”包含三個獨立的能力能力說明常見操作方式平移拖拽改變模型在地圖上的位置鼠標左鍵按住模型拖動旋轉(zhuǎn)改變模型的朝向航向、俯仰、翻滾鼠標右鍵拖動或快捷鍵組合縮放改變模型的顯示大小鼠標滾輪或滑塊這三種操作在 Cesium 中的實現(xiàn)思路不同但核心都依賴坐標轉(zhuǎn)換和鼠標事件處理下面逐一展開。1.2 Cesium 模型交互的核心對象在動手寫代碼之前先認識幾個 Cesium 中負責(zé)模型交互的關(guān)鍵對象后面所有代碼都和它們相關(guān)。ViewerCesium 的視圖容器負責(zé)創(chuàng)建三維場景、管理相機、綁定鼠標交互。EntityCesium 中面向數(shù)據(jù)的高層對象可以用來加載三維模型、點、線、面等。對模型來說entity.position控制位置entity.orientation控制姿態(tài)。ModelGraphicsEntity中專門描述三維模型的屬性例如uri模型地址、scale縮放、minimumPixelSize最小像素尺寸等。ScreenSpaceEventHandlerCesium 的鼠標事件處理器可以監(jiān)聽單擊、雙擊、鼠標移動、滾輪等事件。Camera場景相機包含pickEllipsoid方法用于把屏幕坐標轉(zhuǎn)換成橢球體上的世界坐標。這是實現(xiàn)拖拽時最重要的方法之一。從官方提供的示例出發(fā)加載一個 glTF 模型通常只需要幾行代碼const entity viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.39, 39.9, 0), model: { uri: path/to/model.glb, scale: 1 } }); viewer.zoomTo(entity);但加載容易交互難。拖拽變換要解決的核心問題是如何把鼠標在屏幕上的二維移動轉(zhuǎn)換成模型在三維世界中的位置、朝向和大小變化。這就是本文接下來要講的重點。2. 環(huán)境準備與版本說明2.1 開發(fā)環(huán)境本文示例基于 Web 項目使用原生 JavaScript HTML 開發(fā)不涉及框架集成。你只需要準備好一個支持 WebGL 的現(xiàn)代瀏覽器Chrome、Edge、Firefox 均可。一個文本編輯器或 IDEVSCode 即可。Cesium 庫文件可以用 CDN 引入也可以使用 npm 安裝。一個可用的 glTF/glb 三維模型文件。版本方面需要說明一下Cesium 的 API 在持續(xù)演進不同版本的Model、Entity相關(guān)屬性可能有細微差別。本文示例以 Cesium 1.103 版本為基礎(chǔ)編寫實際項目中請根據(jù)自己使用的版本調(diào)整。2.2 引入 Cesium最簡單的方式是使用 CDN 引入!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleCesium 三維模型拖拽變換/title style html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } /style link hrefhttps://cdn.jsdelivr.net/npm/cesium1.103/Build/Cesium/Widgets/widgets.css relstylesheet script srchttps://cdn.jsdelivr.net/npm/cesium1.103/Build/Cesium/Cesium.js/script /head body div idcesiumContainer/div /body /html如果你使用的是 Vue、React 等框架也可以通過 npm 安裝npm install cesium1.103然后在框架里使用import * as Cesium from cesium引入??蚣芗傻臅r候注意 Cesium 的靜態(tài)資源路徑配置例如CESIUM_BASE_URL的設(shè)置否則會出現(xiàn)加載不到資源的問題。2.3 示例項目結(jié)構(gòu)本文的完整示例最終只用一個 HTML 文件 一個模型文件不需要額外的后端服務(wù)model-drag-demo/ ├── index.html └── model/ └── demo.glb如果你本地沒有 glb 模型可以先下載 Cesium 官方示例模型或者使用市場上任何一個 glTF 格式模型調(diào)試。需要提醒的是商用項目請確保模型素材的來源和授權(quán)本文重點在交互實現(xiàn)不對模型內(nèi)容展開。3. 拖拽變換的核心原理3.1 屏幕坐標與三維坐標的轉(zhuǎn)換實現(xiàn)拖拽第一個要搞明白的是鼠標在屏幕上只有 x、y 兩個坐標像素坐標而三維世界中的模型位置是 x、y、z 三個坐標世界坐標。鼠標拖動時系統(tǒng)需要知道“鼠標當(dāng)前位置對應(yīng)三維空間中的哪個點”。Cesium 提供了一系列坐標轉(zhuǎn)換方法Cesium.Cartesian2屏幕坐標像素坐標例如鼠標位置。Cesium.Cartesian3三維笛卡爾坐標包含 x、y、z。Cesium.Cartographic地理坐標經(jīng)度、緯度、高度。viewer.camera.pickEllipsoid(windowPosition)把屏幕坐標投影到橢球體表面返回對應(yīng)的Cartesian3世界坐標。pickEllipsoid是實現(xiàn)拖拽平移的關(guān)鍵方法。它的原理可以理解為從相機位置發(fā)射一條射線穿過鼠標所在的屏幕像素點與地球橢球體求交得到交點坐標。當(dāng)模型在地球表面附近時這個交點就是拖拽時模型應(yīng)該跟隨的目標點。3.2 拖拽的數(shù)學(xué)思路平移拖拽的基本邏輯可以拆成三步鼠標按下時記錄當(dāng)前屏幕坐標和模型當(dāng)前世界坐標。鼠標移動時通過pickEllipsoid獲取當(dāng)前屏幕坐標對應(yīng)的世界坐標。根據(jù)鼠標移動產(chǎn)生的世界坐標偏移量更新模型的位置。這里的偏移量計算有兩種常見思路直接賦值法鼠標移動時把pickEllipsoid返回的世界坐標直接設(shè)置為模型位置。這種方式操作簡單但模型會“跳”到鼠標指向的地球表面點初始點擊的位置和模型中心之間可能有偏差拖拽時模型容易出現(xiàn)突然跳動。增量移動法鼠標按下時記錄點擊點的世界坐標和模型的世界坐標之間的差值鼠標移動時用當(dāng)前點的世界坐標加上這個差值作為模型新位置。這種方式模型與鼠標的相對位置保持不變體驗更好也是本文推薦的方式。旋轉(zhuǎn)和縮放則相對獨立旋轉(zhuǎn)通過修改entity.orientation使用四元數(shù)Quaternion表示模型的姿態(tài)??s放通過修改entity.model.scale這是一個數(shù)值類型直接改變模型縮放倍數(shù)。3.3 操作模式設(shè)計在三維場景中鼠標左鍵默認是旋轉(zhuǎn)相機的操作如果直接讓左鍵拖拽模型會與相機操作沖突。項目里常用的方案有幾種方案操作方式適用場景左鍵拖拽模型左鍵按住模型拖動相機鎖定或交互模式切換藍圖式多按鍵左鍵平移右鍵旋轉(zhuǎn)滾輪縮放模型編輯、場景編輯器熱鍵切換按住 Shift 或 Ctrl 切換拖拽模式避免與相機操作沖突本文示例采用“選中模式 操作模式”的思路點擊模型后選中鼠標在模型上時顯示提示左側(cè)執(zhí)行平移右鍵執(zhí)行旋轉(zhuǎn)滾輪控制縮放。這樣既能保證體驗也方便你理解每一種變換的核心代碼。4. 手寫模型平移拖拽4.1 初始化 Viewer 并加載模型一切從創(chuàng)建一個Viewer開始。為了方便調(diào)試可以關(guān)閉一些默認自帶的效果讓場景更干凈const viewer new Cesium.Viewer(cesiumContainer, { animation: false, timeline: false, baseLayerPicker: false, geocoder: false, homeButton: false, sceneModePicker: false, navigationHelpButton: false, infoBox: false, selectionIndicator: false });然后加載模型。為了后面操作方便我們用一個全局變量currentEntity保存當(dāng)前操作的模型let currentEntity null; function loadModel() { const position Cesium.Cartesian3.fromDegrees(116.391, 39.907, 0); currentEntity viewer.entities.add({ position: position, model: { uri: model/demo.glb, scale: 1, minimumPixelSize: 128, maximumScale: 2000 } }); viewer.zoomTo(currentEntity); }minimumPixelSize的作用是保證模型在距離較遠時也有最小像素尺寸不會被縮得太小導(dǎo)致看不見maximumScale則相反限制模型的最大縮放倍率。這兩個參數(shù)在模型交互時很有用能讓模型始終處于可見和可點擊的狀態(tài)。4.2 拾取模型在 Cesium 中拾取模型有兩種常用方式。第一種是通過viewer.pick方法它返回屏幕坐標下被點擊的對象。const handler new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (Cesium.defined(picked) picked.id picked.id currentEntity) { console.log(模型被選中); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK);需要注意viewer.scene.pick返回的對象中id屬性是 primitive 或 entity 的引用。如果是Entity的模型這個id就是該實體本身。第二種拾取方式是viewer.scene.drillPick它可以拾取同一個位置上的多個對象返回一個數(shù)組。當(dāng)場景中模型密集、存在遮擋時drillPick會更靈活。不過對大多數(shù)場景來說pick已經(jīng)夠用。4.3 實現(xiàn)左鍵拖拽平移接下來是重頭戲?qū)崿F(xiàn)鼠標左鍵按住模型拖動?;臼录鞒虨長EFT_DOWN鼠標左鍵按下判斷是否選中了模型。如果選中進入拖拽狀態(tài)并記錄偏移量。MOUSE_MOVE鼠標移動如果當(dāng)前處于拖拽狀態(tài)則更新模型位置。LEFT_UP鼠標左鍵抬起退出拖拽狀態(tài)。我們需要幾個局部變量來記錄狀態(tài)let isDragging false; let dragOffset new Cesium.Cartesian3(); // 鼠標與模型位置的偏移量 let pickedModel null;然后綁定事件。LEFT_DOWN 事件handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (!Cesium.defined(picked)) { return; } const pickedEntity picked.id; if (pickedEntity pickedEntity currentEntity) { isDragging true; pickedModel currentEntity; // 獲取點擊位置對應(yīng)的世界坐標 const cartesian viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid); if (cartesian) { // 計算點擊點和模型位置之間的偏移 dragOffset Cesium.Cartesian3.subtract( pickedModel.position.getValue(Cesium.JulianDate.now()), cartesian, new Cesium.Cartesian3() ); } } }, Cesium.ScreenSpaceEventType.LEFT_DOWN);這里的關(guān)鍵是dragOffset。它的含義是“模型位置相對于鼠標點擊點在地球上的位置”的偏移量。在后續(xù)移動時我們用“當(dāng)前鼠標位置對應(yīng)的地球坐標 dragOffset”作為模型的新位置這樣模型就能始終跟隨鼠標并且不會發(fā)生突然跳動。MOUSE_MOVE 事件handler.setInputAction(function (movement) { if (!isDragging || !pickedModel) { return; } const cartesian viewer.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid); if (!cartesian) { return; } // 用當(dāng)前點 偏移量 作為模型新位置 const newPosition Cesium.Cartesian3.add(cartesian, dragOffset, new Cesium.Cartesian3()); pickedModel.position newPosition; }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);注意movement.endPosition是鼠標移動事件結(jié)束時的屏幕坐標。使用movement.position在某些場景下也能工作但endPosition是標準寫法。LEFT_UP 事件handler.setInputAction(function () { isDragging false; pickedModel null; }, Cesium.ScreenSpaceEventType.LEFT_UP);到這里一個最基礎(chǔ)的三維模型拖拽平移功能就完成了。有一點特別提醒在拖拽過程中屏幕空間相機控制器可能也在響應(yīng)鼠標操作導(dǎo)致你拖動模型時相機同時旋轉(zhuǎn)。要解決這個問題可以在拖拽開始后禁用相機操作拖拽結(jié)束后恢復(fù)// 禁用相機 viewer.scene.screenSpaceCameraController.enableRotate false; viewer.scene.screenSpaceCameraController.enableTranslate false; // 恢復(fù)相機 viewer.scene.screenSpaceCameraController.enableRotate true; viewer.scene.screenSpaceCameraController.enableTranslate true;這在操作體驗上非常重要不處理的話模型拖拽會非常別扭。4.4 為什么使用 pickEllipsoid 而不是拾取地形可能有讀者會問為什么拖拽時不直接使用viewer.scene.pickPosition或者viewer.scene.globe.pick這里簡要說明一下viewer.scene.pickPosition依賴于深度緩沖區(qū)需要場景支持scene.pickPositionSupported在某些設(shè)置下會返回 undefined。viewer.scene.globe.pick只能拾取地球表面的點無法處理建筑物、模型遮擋等情況。viewer.camera.pickEllipsoid是把射線與橢球體求交只要相機姿勢正?;径紩祷赜行е颠m合做“地面拖拽”操作。如果你的模型不是貼在地面上而是懸浮在空中或者你想要“模型沿某個平面拖動”的效果那就需要自己定義一個平面例如通過Cesium.Plane來做射線求交或者使用Cesium.IntersectionTests系列方法。本文先不展開但知道pickEllipsoid的局限性對后續(xù)深入很有幫助。5. 實現(xiàn)旋轉(zhuǎn)與縮放5.1 旋轉(zhuǎn)模型修改 Orientation在 Cesium 中一個實體的朝向由orientation屬性控制它是四元數(shù)表示的。我們可以通過Cesium.Transforms.headingPitchRollQuaternion方法來生成四元數(shù)。HeadingPitchRoll三個參數(shù)的含義heading航向角繞 Z 軸旋轉(zhuǎn)范圍是 [-PI, PI]簡單理解就是“模型臉朝哪個方向”。pitch俯仰角繞 Y 軸旋轉(zhuǎn)可以理解為“模型抬頭低頭”。roll翻滾角繞 X 軸旋轉(zhuǎn)表示“模型左右翻滾”。一個常用的交互方式是“右鍵拖動旋轉(zhuǎn)”。我們希望在鼠標水平移動時改變模型的 heading鼠標垂直移動時改變模型的 pitch。實現(xiàn)思路是右鍵按下時記錄當(dāng)前模型的headingPitchRoll和鼠標起始位置。右鍵拖動時根據(jù)鼠標橫向和縱向的像素位移計算 heading 和 pitch 的變化量。用新的 heading、pitch、roll 生成四元數(shù)并賦值給entity.orientation。代碼片段如下let isRotating false; let lastHeading 0; let lastPitch 0; let lastRoll 0; let lastMouseX 0; let lastMouseY 0; // 右鍵按下 handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (!Cesium.defined(picked) || picked.id ! currentEntity) { return; } isRotating true; const hpr getEntityHPR(currentEntity); lastHeading hpr.heading; lastPitch hpr.pitch; lastRoll hpr.roll; lastMouseX movement.position.x; lastMouseY movement.position.y; }, Cesium.ScreenSpaceEventType.RIGHT_DOWN); // 鼠標移動 handler.setInputAction(function (movement) { if (!isRotating) { return; } const deltaX movement.endPosition.x - lastMouseX; const deltaY movement.endPosition.y - lastMouseY; const newHeading lastHeading deltaX * 0.01; const newPitch lastPitch deltaY * 0.01; const hpr new Cesium.HeadingPitchRoll(newHeading, newPitch, lastRoll); const orientation Cesium.Transforms.headingPitchRollQuaternion( currentEntity.position.getValue(Cesium.JulianDate.now()), hpr ); currentEntity.orientation orientation; }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); // 右鍵抬起 handler.setInputAction(function () { isRotating false; }, Cesium.ScreenSpaceEventType.RIGHT_UP);輔助函數(shù)getEntityHPR可以在旋轉(zhuǎn)開始前讀取當(dāng)前模型的姿態(tài)角function getEntityHPR(entity) { const position entity.position.getValue(Cesium.JulianDate.now()); const orientation entity.orientation.getValue(Cesium.JulianDate.now()); // 如果 orientation 為空默認朝向正北方 if (!Cesium.defined(orientation)) { return new Cesium.HeadingPitchRoll(0, 0, 0); } // 使用 Transforms 的四元數(shù)轉(zhuǎn) HPR const hpr Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(0, 0, 0)); // 這里簡化處理如果希望精確還原 HPR需要計算矩陣 // 實際項目中建議在保存模型狀態(tài)時直接記錄 HPR而不是從四元數(shù)反推 return new Cesium.HeadingPitchRoll(0, 0, 0); }這里需要誠實說明一個實際開發(fā)中的問題Cesium 原生 API 沒有直接提供從四元數(shù)反推 HPR 的簡便方法雖然可以通過矩陣運算實現(xiàn)但代碼相對復(fù)雜。更穩(wěn)妥的做法是在模型初始加載時保存一個currentHPR對象之后每次旋轉(zhuǎn)操作都基于這個對象更新。這樣既保證可控性也簡化了代碼。所以在實際項目中更推薦維護一份模型狀態(tài)let currentHPR new Cesium.HeadingPitchRoll(0, 0, 0); // 旋轉(zhuǎn)開始時 currentHPR.heading 0; currentHPR.pitch 0; currentHPR.roll 0; // 旋轉(zhuǎn)移動時 const newHPR new Cesium.HeadingPitchRoll( currentHPR.heading deltaX * 0.01, currentHPR.pitch deltaY * 0.01, currentHPR.roll ); const orientation Cesium.Transforms.headingPitchRollQuaternion( currentEntity.position.getValue(Cesium.JulianDate.now()), newHPR ); currentEntity.orientation orientation;這種“狀態(tài)模型”的方式在模型編輯類項目中很重要因為你不只是需要顯示效果還需要在某個時刻“確定”模型的新姿態(tài)并把它保存下來。5.2 縮放模型修改 Model.scale縮放相對簡單直接監(jiān)聽鼠標滾輪事件handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (!Cesium.defined(picked) || picked.id ! currentEntity) { return; } const scale currentEntity.model.scale.getValue(); const newScale movement.endPosition ? scale * 1.1 : scale * 0.9; currentEntity.model.scale newScale; }, Cesium.ScreenSpaceEventType.WHEEL);movement對象中包含startPosition和endPosition在滾輪事件里用來判斷滾動方向。這里我們簡單把它處理為滾輪向上放大 10%向下縮小 10%。需要注意currentEntity.model.scale在 Cesium 中是一個Property在某些版本中需要用.getValue()讀取當(dāng)前值用賦值方式寫入新值。如果你的 Cesium 版本較老可能需要改為currentEntity.model.scale newScale直接賦值建議以實際版本為準。5.3 組合操作與模式提示為了讓用戶知道當(dāng)前模型處于“可編輯”狀態(tài)可以在選中模型時改變一個提示區(qū)域的內(nèi)容#tips { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); padding: 8px 20px; background: rgba(0, 0, 0, 0.7); color: #fff; border-radius: 6px; font-size: 14px; pointer-events: none; z-index: 999; }div idtips左鍵拖拽移動模型 | 右鍵拖拽旋轉(zhuǎn)模型 | 滾輪縮放模型/div選中模型時把提示內(nèi)容更新為“當(dāng)前選中模型”未選中時保持默認提示。這樣用戶就能清楚地知道當(dāng)前操作模式。6. 完整示例代碼為了方便你直接運行把上面所有內(nèi)容整合成一個完整的 HTML 頁面。你只需要準備一個 glb 模型文件并修改MODEL_URL即可。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleCesium 三維模型拖拽變換完整示例/title style html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; font-family: Microsoft YaHei, sans-serif; } #tips { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); padding: 8px 20px; background: rgba(0, 0, 0, 0.75); color: #fff; border-radius: 6px; font-size: 14px; pointer-events: none; z-index: 999; white-space: nowrap; } #status { position: absolute; bottom: 20px; left: 20px; padding: 6px 12px; background: rgba(0, 0, 0, 0.6); color: #ddd; border-radius: 4px; font-size: 12px; z-index: 999; pointer-events: none; } /style link hrefhttps://cdn.jsdelivr.net/npm/cesium1.103/Build/Cesium/Widgets/widgets.css relstylesheet script srchttps://cdn.jsdelivr.net/npm/cesium1.103/Build/Cesium/Cesium.js/script /head body div idcesiumContainer/div div idtips左鍵拖拽模型移動 · 右鍵拖拽旋轉(zhuǎn) · 滾輪縮放/div div idstatus未選中模型/div script // 你的模型地址替換為實際路徑 const MODEL_URL model/demo.glb; const viewer new Cesium.Viewer(cesiumContainer, { animation: false, timeline: false, baseLayerPicker: false, geocoder: false, homeButton: false, sceneModePicker: false, navigationHelpButton: false, infoBox: false, selectionIndicator: false, shouldAnimate: true }); // 視野定位到北京 viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(116.391, 39.907, 500), orientation: { heading: 0, pitch: Cesium.Math.toRadians(-30), roll: 0 } }); let currentEntity null; // 加載模型 function loadModel() { const position Cesium.Cartesian3.fromDegrees(116.391, 39.907, 30); currentEntity viewer.entities.add({ position: position, orientation: Cesium.Transforms.headingPitchRollQuaternion( position, new Cesium.HeadingPitchRoll(0, 0, 0) ), model: { uri: MODEL_URL, scale: 1, minimumPixelSize: 64, maximumScale: 5000 } }); viewer.zoomTo(currentEntity, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-35), 200)); } // 拖拽狀態(tài)管理 let isDragging false; let isRotating false; let dragOffset new Cesium.Cartesian3(); let pickedModel null; let currentHPR new Cesium.HeadingPitchRoll(0, 0, 0); let lastMouseX 0; let lastMouseY 0; const handler new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); // 左鍵拖拽平移 handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (!Cesium.defined(picked) || picked.id ! currentEntity) { return; } isDragging true; pickedModel currentEntity; document.getElementById(status).textContent 拖拽移動中...; // 拖拽時禁用相機操作避免沖突 viewer.scene.screenSpaceCameraController.enableRotate false; viewer.scene.screenSpaceCameraController.enableTranslate false; const cartesian viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid); if (cartesian) { const currentPosition currentEntity.position.getValue(Cesium.JulianDate.now()); dragOffset Cesium.Cartesian3.subtract( currentPosition, cartesian, new Cesium.Cartesian3() ); } }, Cesium.ScreenSpaceEventType.LEFT_DOWN); handler.setInputAction(function (movement) { if (!isDragging || !pickedModel) { return; } const cartesian viewer.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid); if (!cartesian) { return; } const newPosition Cesium.Cartesian3.add(cartesian, dragOffset, new Cesium.Cartesian3()); pickedModel.position newPosition; }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function () { if (isDragging) { isDragging false; pickedModel null; document.getElementById(status).textContent 已選中模型; // 恢復(fù)相機操作 viewer.scene.screenSpaceCameraController.enableRotate true; viewer.scene.screenSpaceCameraController.enableTranslate true; } }, Cesium.ScreenSpaceEventType.LEFT_UP); // 右鍵旋轉(zhuǎn)模型 handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (!Cesium.defined(picked) || picked.id ! currentEntity) { return; } isRotating true; document.getElementById(status).textContent 旋轉(zhuǎn)模型中...; // 從當(dāng)前狀態(tài)讀取 HPR這里使用我們維護的 currentHPR // 實際項目中可以從模型屬性中讀取或統(tǒng)一存儲 lastMouseX movement.position.x; lastMouseY movement.position.y; }, Cesium.ScreenSpaceEventType.RIGHT_DOWN); handler.setInputAction(function (movement) { if (!isRotating || !currentEntity) { return; } const deltaX movement.endPosition.x - lastMouseX; const deltaY movement.endPosition.y - lastMouseY; currentHPR.heading deltaX * 0.01; currentHPR.pitch deltaY * 0.01; const position currentEntity.position.getValue(Cesium.JulianDate.now()); const orientation Cesium.Transforms.headingPitchRollQuaternion(position, currentHPR); currentEntity.orientation orientation; lastMouseX movement.endPosition.x; lastMouseY movement.endPosition.y; }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function () { if (isRotating) { isRotating false; document.getElementById(status).textContent 已選中模型; } }, Cesium.ScreenSpaceEventType.RIGHT_UP); // 滾輪縮放模型 handler.setInputAction(function (movement) { const picked viewer.scene.pick(movement.position); if (!Cesium.defined(picked) || picked.id ! currentEntity) { return; } const currentScale currentEntity.model.scale.getValue(); let newScale; if (movement.endPosition) { // 滾輪向上放大 newScale currentScale * 1.1; } else { // 滾輪向下縮小 newScale currentScale * 0.9; } newScale Math.max(0.1, Math.min(100, newScale)); currentEntity.model.scale newScale; document.getElementById(status).textContent 當(dāng)前縮放 newScale.toFixed(2); }, Cesium.ScreenSpaceEventType.WHEEL); // 初始化 loadModel(); /script /body /html這個示例基本覆蓋了 90% 的常規(guī)需求。直接打開頁面加載自己的 glb 模型后就能按住鼠標左鍵移動模型右鍵拖動旋轉(zhuǎn)滾動滾輪縮放模型。7. 常見問題與排查思路在實際開發(fā)中拖拽交互經(jīng)常遇到各種“奇怪”的問題。下面把高頻問題的排查思路整理成一個清單方便你在項目里對照檢查。問題現(xiàn)象常見原因解決思路點擊模型時沒有拾取到實體模型在場景中被其他對象遮擋或者屏幕坐標系有偏差檢查相機位置使用console.log(picked)輸出拾取結(jié)果或改用drillPick查看是否拾取到了其他對象拖拽時模型跳動明顯沒有使用增量移動直接賦值導(dǎo)致模型位置跳變使用本文的dragOffset方案計算偏移量再更新位置拖拽時相機跟著旋轉(zhuǎn)沒有在拖拽期間禁用相機控制器在拖拽開始/結(jié)束時設(shè)置screenSpaceCameraController.enableRotate和enableTranslate模型拖不動鼠標沒有真正拾取到模型或者模型沒有minimumPixelSize設(shè)置minimumPixelSize: 64避免模型像素過小難以點選檢查模型加載是否成功旋轉(zhuǎn)時模型翻轉(zhuǎn)異常heading、pitch、roll 累加時沒有統(tǒng)一處理邊界對角度做歸一化處理例如限制 heading 在 [-PI, PI] 范圍縮放時模型直接消失scale 設(shè)置得過大或過小加入范圍限制例如Math.max(0.1, Math.min(100, newScale))Entity 拾取不到但模型正常顯示Entity 的show狀態(tài)或模型未加載完成在viewer.clock或tileLoad事件后延遲綁定交互使用 Vue/React 時Cesium 報錯找不到資源CESIUM_BASE_URL 配置錯誤npm 方式引用時需要把 Cesium 的靜態(tài)資源目錄復(fù)制到項目并設(shè)置全局window.CESIUM_BASE_URL滾輪事件同時觸發(fā)了頁面滾動頁面高度超出視口在容器樣式上使用overflow: hidden或監(jiān)聽事件時調(diào)用preventDefault除了表格里的問題還有兩個比較隱蔽的坑值得單獨拿出來說??右皇叭〉氖?primitive不是 entity如果你的項目中同時存在PrimitiveAPI 加載的模型和EntityAPI 加載的模型scene.pick返回的id類型可能不一樣。很多人在初始化時沒有區(qū)分導(dǎo)致判斷條件不成立。建議在代碼里統(tǒng)一做判斷if (picked.id instanceof Cesium.Entity) { // entity 方式 }坑二模型加載完成前無法點擊如果你的模型是異步加載的在模型資源還沒有完全加載完成時點擊scene.pick可能返回 undefined。這種情況在本地局域網(wǎng)部署時幾乎不會出現(xiàn)但在網(wǎng)絡(luò)較差的演示環(huán)境里經(jīng)常遇到。建議監(jiān)聽模型加載完成事件例如viewer.scene.clippingPlanes或者直接使用tileLoad事件也可以簡化處理模型加載后延時 1 秒再允許交互。8. 最佳實踐與工程建議8.1 狀態(tài)管理與數(shù)據(jù)保存拖拽變換不僅是“視覺上動了”更重要的是業(yè)務(wù)上要保得住。實際項目中不要直接去操作viewer.entities而是建議維護一份獨立的模型狀態(tài)對象例如const modelState { id: model_001, position: { longitude: 116.391, latitude: 39.907, height: 30 }, heading: 0, pitch: 0, roll: 0, scale: 1 };每次拖拽、旋轉(zhuǎn)、縮放結(jié)束時同步更新modelState再把最終數(shù)據(jù)提交給后端。這樣做有幾個好處程序運行期間不依賴 Cesium 對象就能獲取模型狀態(tài)。保存到數(shù)據(jù)庫時只需要轉(zhuǎn)換一次坐標格式。支持多視圖同步、撤銷恢復(fù)等復(fù)雜功能。設(shè)計交互模式時建議區(qū)分“臨時調(diào)整”和“確定修改”??梢杂秒p擊模型確認變更用 Esc 鍵取消當(dāng)前操作。真正做生產(chǎn)項目時模型編輯往往會有“保存”“取消”按鈕而不是每次操作都立刻寫入數(shù)據(jù)庫。8.2 性能優(yōu)化單個模型的拖拽通常不會造成性能瓶頸但如果你在編輯一個很大的場景包含幾十上百個模型就需要考慮一些性能策略拖拽過程中不要頻繁調(diào)用viewer.scene.renderCesium 默認的渲染循環(huán)已經(jīng)足夠。不要每次移動都去查詢某個 Primitive 的矩陣盡量在內(nèi)存中維護好當(dāng)前值。如果模型中包含大量動畫節(jié)點拖拽過程中可以臨時關(guān)閉動畫更新減少 CPU 開銷。大批量模型編輯時優(yōu)先考慮PrimitiveAPI 或者EntityCluster避免創(chuàng)建過多 Entity 對象。8.3 交互體驗細節(jié)項目上線后用戶反饋最多的往往不是功能是否實現(xiàn)而是“好不好用”。下面幾個細節(jié)可以明顯提升體驗選中高亮模型被選中時可以給模型添加輪廓線或修改模型顏色讓用戶明確知道當(dāng)前操作對象。拖拽吸附在規(guī)劃類項目中拖拽模型時可以增加網(wǎng)格吸附、角度吸附功能幫助用戶更精確地擺放模型。操作回顯拖拽過程中實時顯示坐標、朝向、縮放數(shù)據(jù)方便微調(diào)。右鍵菜單在模型上提供右鍵菜單放置“復(fù)制”“刪除”“屬性”等功能入口減少用戶的記憶成本。8.4 代碼結(jié)構(gòu)建議如果你要在大型項目中落地建議不要把所有代碼堆在一個文件里??梢园绰氊?zé)拆分src/ ├── viewer/ # Viewer 初始化 ├── entity/ # 模型加載與狀態(tài)管理 ├── interaction/ # 鼠標事件綁定 │ ├── drag.js # 平移拖拽 │ ├── rotate.js # 旋轉(zhuǎn) │ └── scale.js # 縮放 └── utils/ └── coordinate.js # 坐標轉(zhuǎn)換這樣拆分之后每個模塊職責(zé)單一調(diào)試和測試都會輕松很多。拖拽、旋轉(zhuǎn)、縮放這三個交互未來如果需要支持觸屏設(shè)備或多用戶協(xié)同也能更快地替換和擴展。最后想說的是三維場景的模型交互往往沒有“唯一標準答案”。不同業(yè)務(wù)場景對操作方式的需求差異很大有的需要模型貼地拖拽有的需要模型在垂直面上移動有的需要模型沿指定路徑滑動。理解了坐標轉(zhuǎn)換、射線求交和狀態(tài)管理這三個核心點其他各種變體其實都能自己寫出來。希望這篇文章能幫你跨過 Cesium 模型交互的第一道門檻少走一些彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香六月婷婷综合网| 丁香 婷婷五月| 爽极品色| 久久人人九九| 久久婷婷五月天丁香| 丁香五月天激情免费在线观看AV777| 激情婷婷丁香色五月| 婷婷开心六月| 综合婷婷久久| 五月婷婷香蕉视频| 色婷五月天| 这里只有精品免费| 狠狠干伊人| www.com任你艹| 色婷婷久久| 丁香婷婷在线| 青草视频在线蜜臀| WWW丁香五月| 久久久久九九九九视屏小说88| 九九99精品视频| 色欲丁香久久| 婷婷五月天最新综合你懂的| 女婷久久| 久草视频一,二三四| 激情综合网五月婷婷| 丁香六月色婷婷综合| 热99国产精品| 青青草原爱爱网| 丁香五月激情五月| 激情五月天电影| 久久久精品色| 伊人五月成人| 26uuu亚洲精品国产| 色爱综合网| 伊人在线大香蕉网| 激情色情五月天| 人妻少妇色综合| www.色综合.com| SESE无码AV| 五月天天丁香婷婷在线中| 久操大屁股女人av| 伊人久久中文网| 婷婷五月色综合香五月| 色欲AVV| 99热国产免费| 91婷婷| 天天射影院| 狠狠色综合网站| 99热这里只有精品亚洲| 天天日夜夜草进麻麻的子宫| 立川无码av| 婷婷久久五月丁香| www久久久| 激情婷婷五月天| 五月丁香六月婷婷网| 欧美激情VA永久在线播放| 亚洲国产精品五月天| 性爱网五月天| 丁香五月情色| 色婷婷色五月另类综合| www.十八禁不禁AV.com| 色色色视频免费无码| 97人人射| 五月婷婷久久综合| 综合激情网五月激情| 99久久婷婷国产综合亚洲| 裸体做A爰片毛片A片免费| se99视频| 亚洲精品字幕| 超碰AV成人| 亚洲AV无码一区二| 久碰视频| 日本激情五月| 婷婷六月天激情| 99er6| WWW·天天操·视频?| 丁香五月婷婷啪啪啪| 久久五月激情| 亚洲久久视频| 青青草蜜臀| 亚洲综合干| 婷婷丁香激情五月| 人妻九九九九| 丁香婷婷激情| 风流少妇A片一区二区蜜桃| 69精品人人人人| 午夜性做爰电影| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 婷香五月网在线| 精品一区二区三区四区五区六区介绍| 婷婷开心综合人妻小说网址| 天天做天天爽| 91婷婷| 久久A极片| 99久久婷婷精品视频| 丁香激情综合| 99视频内射三四| 婷婷激情六月综合| 综合网色| 99资源人人| 婷婷五月色影视先锋| 99热老网站| 99在线精品观看99| 热久久66| 婷婷五月丁香基地| 极品人妻VIDEOSSS人妻| 99ri精品在线| 国产婷婷五月天| 五月婷婷欧美| 亚洲视频久久| 久热婷婷| 色婷狠狠| 99久久99综合| 5月激情天| 激情九九这里只有精品| www.天天干| 91精品刘玥| 热99精品视频五月| 色婷婷小说网| 大香蕉视频婷婷| 一级AV片| 六月丁香视频网站| 九九九色综合| 99色日本| www.人人操人人看人人想人人摸 人人人人操,COM | 五月婷久久| 色丁香五月| 亚洲第一色色色| 五月婷婷视频28| 五月婷婷中文字幕| 26uuu成人网| 99re66热这里只有精品| 超碰超碰在线| AV片在线观看| 91小黄书网址在线观看| 五月丁香啪啪激情| 久9热视频在线观看| 色五月综合婷婷| 色v综合网| 人妻AV在线| 五月丁香六月婷婷姐| 五月丁香六月婷婷激情视频在线观看免费| www.金莲av| 天天做天天视天天谢| 美女五月天| 狠狠操狠狠| 99自拍视频在线观看| 亚洲欧美999| 熟妇内谢69XXXXXA片| 九九Av| 五月天啪啪啪| 性爱视频99| 日韩淑女人妻luan伦激情精品一区二 | 亚洲午夜精品久久久久久人妖| 91九色视频在线观看| www.99.色| 日操| 97啪在线观看视频| 99视频这里只有免费精品| 婷婷五月天成人动漫 | 图片区 小说区 区 亚洲五月 | 99亚洲天堂| 色七七九九| 色色色99| 色婷婷啪啪啪啪啪啪| 激情婷婷五月天在线观看| 丁香五月影院| AV伊人青草丁香六月| 色吧五月婷婷| 色婷婷影视| 日本激情综合| 99热在线只有精品| 任你爽免费视频| 91色在线 | 日韩| 人人叉久| 五月丁香婷婷综合网| 金桔一区二区ab地址| 噜噜五月天综合| 婷婷综合仓库中文| 五月婷婷深深爱| 99ri在线播放| 九九热最新| 婷婷 激情 五月| 国产欧美日韩综合精品一区二区| 婷婷五月色播放| 97操在线资源| 久久婷婷啪啪视频| 26UUU欧美激情一区二区| 9l视频自拍9l九色9l成人| 91综合色| 中文字幕免费高清电视剧| 狠狠色综合五月| 99人妻碰碰碰久久久久| 99热91| 婷婷丁香射射| 五月天婷婷网站| 激情五月久久| 丁香激惜男女| 在线99色| 丰满少妇猛烈A片免费看观看| 丁香六月无码| 六月丁香婷婷色狠狠久久| 丁香五月婷婷啪啪| 第四色首页| 99国产97在线,| 久久免费丁香| 五月丁香影院| 精品成人在线观看| 久久久久人无码人妻| 99色久| 婷婷五月六月丁香| 激情五月婷黄版| 五月天开心激情网色欲无码| 婷五月天丁香婷五月| 婷婷五月天AV| 怡红院院在线导航网| 玖玖@三月天天丁香婷婷| 九九性视频| 華人性愛AV在線| 综合网五月| 久久久婷婷| 婷婷婷婷午夜| 激情五月天色播| 激情五月网站| 一本久道综合99| 青青草免费公开视频| 狠狠操在线视频| 欧美 日韩 成人 在线| www.色综合| 思思热精品在线观看| 九九久久五月天| 成人无码髙潮喷水A片| 超碰资源在线| 五月色 亚洲| 伊人九九热| 五月开心久久| 99久久久免费| 激情丁香五月| 伊人9999| 99精品视频在线6| 色婷婷精品视频在线播放| 天天干天天日天天操| 综合在线丁香五月| 婷婷性爱无码视频| 99热网站在线观看| 影音先锋女人av鲁色资源网小说免费 | 无码 av电影| AV在线大香蕉| 热久久91| 综合色色婷婷| 色狠狠综合网| 国产激情久久久| 五月天色不卡| 五月婷婷网站| 婷婷成人五月天成人文学小说| 婷婷五月天天天日日夜夜| 99人人操人人爱久久久| 97五月婷| 色婷婷在线视频观看| 极品少妇XXXX精品少妇偷拍| 中文成人在线| 教师性爱毛片| 99婷五月| 欧美成人猛片AAAAAAA| 色欲天天综合网| 久久99jiu9| 亚洲色五月天是什么| 久久免费精品小视频| 99精品高潮| www.一区二区三区| 九八Av| 国产看真人毛片爱做A片| 欧洲色| 综合久久婷婷| 丁香婷婷九月在线| 1024欧美日韩精品久久久| 成人视频免费观看高清完整版在线观看| 又大又粗九一在线| 婷婷狠狠青青| 色九月综合| 亚洲天堂99| 国产精品久久欧美久久一区| 天天色天天操天天射| 中国女人做爰A片| 五月天激情小说| 国产伦亲子伦亲子视频观看| 婷婷久久欧美| 色射影院| 成人免费120分钟啪啪| 丁香五月激情啪啪| 五月天婷婷社区| 九九五月天| 六月天婷婷| 成人中文网| 五月天丁香婷婷视频网址 | se99热久久一本| 婷婷丁香六月天激情四射网| 97操碰日本女人| xxxx五月天色色| 亚洲性爱电影| 激情婷婷丁香色情五月天| 激情六月日韩| 超碰人人草| 色欲久久综合| 丁香五月婷婷亚洲激情四射| 久久这里这里有精品免费视频| 欧洲亚洲免费视频区| 婷婷狠狠五月综合| 久久久五月五丁香| 色婷婷五月天av在线| 九九99热| 九玖视频这里只有精品| 色五月婷婷激情| 丁香激情网| 日本狠狠干| 久热视频97AV在线观看| 婷婷五月色花丁香社区| 欧美啪啪9| 五月婷婷av| 色噜噜综合网| 欧洲一区二区| 日韩狠狠色| 亚洲一区先锋影音| 五月婷综合| 婷婷狠狠青青| 天天操天天爽天天爱| 激情综合网五月激情网| 超碰人人在线| 丁香五月影视| 99re8在这里只有精品| 日本一级特黄大片AAAAA级| 五月丁香| 亚洲精品成人| 五月色丁香婷婷综合| 久久永久网址| 色婷婷激情| co超碰在线观看| 婷婷99丁香| 五月情婷婷五月| 在线另类视频| 97干在线播放| 色色色色色色网| 第四色五月天| 丁香五月自拍| 91大神操美女| 九色无码| 亚洲成人人人操| 91碰碰碰| WWW.五月天9999| AV操逼网| 91人人澡人人爽人人看| 人人爱人人草| 任你日热视频| 99久久五月婷婷| 丁香色色网| 超碰大香蕉网| 午夜大香蕉| 人人操人人爽成人AV| 色婷婷五月天激情久久| 精品99在线| 久re在线| 狠狠色噜噜狠狠狠888| 丰滿爆乳一区二区三区| 高清激情av在线观看| 丁香六月婷婷综合| 97人人看| 久久久www| 久久婷婷草| 另类五月激情| yw.av| 月月AV| 色色五月天丁香婷婷| 五月激情小说| 成人AV在线网站| 婷婷天天五月天| 国产六月婷婷| 国产精品VIDEOSSEX久久发布| 91精产一区三区免费观看| 丁香婷婷激情五月天无毒不卡蜜桃| 狠狠干综合| 激情久久久| 激情丁香五月| 丁香美女主播视频在线观看| 欧美操逼天堂| 五月天激情网图片| 久9视频| 五月综合久久| 五月色网| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 五月天婷婷久久综合| 精品国产乱码久久久久久免费| 91艹人| www.99热在线观看| 思思99热热热99| 99热综合| 伊人五月天在线| 久色五月天| 四月丁香五月婷婷久久| 伊人久久婷婷| 五月丁香综合精品欧美| 婷婷五月天视频免费在线观看| 色婷婷五月色| 欧美成人AAA片一区国产精品| 综合激情网五月激情| 国产精品第一国产精品| 激情六月色| 久久精典| 欧美日韩成人综合9| 噜噜狠狠色综无码久久合欧美| 婷婷97碰碰| 激情六月天| 久久免费视频62| www.婷婷,com| 欧美美女国产日韩一区二区久 | 国产女18毛片多18精品| 色综合丁香婷婷| 天天撸夜夜爽| 欧美在线视频99| 国产婷婷五月| 玖玖爱伊人网| 疯狂做受XXXX高潮A片| 久热只有精品| 79色色色色| 4399在线观看免费高清电视剧| 99热在线爱| 色色色com| 五月天.com| 婷婷伊人五月天| 人人人人人人人人人草| AV色五月婷婷| 色婷婷香蕉| 色情五月天导航| 色婷婷成人做爰A片免费看网站 | 黄色短视频在线观看| 五月丁香激情综合| 五月婷婷香| 另类激情五月在线视频欧美| 91精品综合久久久久久五月丁香 | 丁香五月激情视频在线| 五月天免费色| 婷婷天天舔| 97香蕉碰碰人妻国产欧美| 色婷婷亚洲综合av| 91碰碰碰久久久久| 色99xx| 久久97久久99久久综合欧美| 色色激情五月天| 久热无码| 能直接看的av网站| 婷婷五月激情中文字幕| 五月天婷婷久久视频| 五月丁香好婷婷A片网| 日日撸夜夜操| 91成人电影| 天天干,天天日| 色婷婷小说| 欧美久久婷婷| 婷婷丁香五月色| 天天狠狠干| 免费观看欧美成人AA片爱我多深| va亚洲中文在线| 天天天日天天天干| 亚洲另类视频| 97人人搞| www.五月天| www.激情五月| 日本不卡一区二区三区| 色就色94欧美setu| 五月天婷婷激情网| 97操操| 婷婷五月黄色激情在线| 婷婷色五月亚洲| 五月丁香婷婷激情在线视频| 严洲天天插| 五月天婷婷视频30| 九月av| 97综合在线| 九九热这里只有精品6| 99这里有精品| 久久精彩视频18| 色99欧洲色19| 婷婷五月综合在线| 婷婷精品在线| 色综合99| 九九色精品| 天天干在线播放| 91亚洲天堂| 色婷婷9| 九九国产精视频| 丁香五月激情站| 天天天天色天天天天天干| 五月婷婷视频| 丁香九月激情| 色99免费视频中文| 天天色一道本综合婷婷| 色色色综合色| 激情综合五月| 大香蕉啪啪啪啪啪啪| 激情伊人| 成人综合伍月天| 日本三久久| 开心激情婷婷| 午夜成人综合| 天天艹天天色| 超碰人人干| 538在线精品| 777久久久| 噜噜色五月| 日日夜夜天天综合| 九九热精品| 婷婷久久婷婷| 婷婷开心青青草| 色综合五月| 日本久久网| 色色色色色色色色色色色色色五月天| 99在线er热| 综合五月婷婷| 欧美成人AAA片一区国产精品| 97超级碰碰碰| 婷婷色丁香五月| 九九热中文| 国产亚洲AV人片在线| 中文字幕婷婷| 婷婷久久丁香| 久久婷婷五月综合色丁香花| 99色精品视频| AV在线免费播放| 五月桃花网综合| 婷婷综合色色| 亚洲综合五月天| 久久五月婷6 9| 久久亚洲婷婷| 伊人网大香| 人操91在线| 激情综合网婷婷久久| 色综合丁香婷婷| 综合久久婷婷99| 天天搽天天射| 色婷婷电影| 9久久精品视频| 色婷婷狠狠色| 国产又粗又大又爽又黄| 国产亚洲精品人人| 六月丁香婷| 丁香五月天激情四射网| 99热在线观看精品| 91九九九九九九| 五月丁香色五月| 五月天另类视频| 99福利导航| 精品人妻一区| 99玖玖人人| 热99AV网站| 69热91天堂| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 婷五月天影院| 99热精品一区| 野战J办公桌椅H| 天天色综合色色色色色。| 996er热| 久婷婷色| 久久激情五月婷婷| 色综合久久88色综合天天99| 日本色天堂| 91视频综合网| 成人五月天丁香| www.99精品视频| 另类激情首页| 大香蕉操操| 激情无码网| 婷婷九月在线| 激情久久久久久| 久综合网| 色久综合| 婷婷五月天在婷| 七七色综合| 五月天最新网| 亚洲旡码| 五月丁香激情综合| 五月婷婷在线网站| 一级韩国产精品毛| WWW免费视频碰碰碰碰| www久久艹| 久久婷婷五月丁香网| 色九网| 激情五月激情综合网| 丁香五月天婷婷久久| 五月婷婷丁香91| 五月天综合影院| 色爱99| 久久久这里有精品| 开心五月婷婷激情网| 91热久88| 成人免费高清在线播放| 五月婷五月婷伊人伊人五月婷| 97人人干| 五月婷婷六月少妇激情| 久99在线视频| 无码日本精品XXXXXXXXX| 人人做人人看人人摸| 午夜色丁香| 五月天色色网站| 欧美色播综合在线观看| 久久99精品久久久| 4399成人黄A片| 日日夜夜爽爽| 99在线精品观看99| 丁香五月玖玖| 亚洲热视频在线| 婷婷色Av| 九九成人精品免费视频| 99爱在线| 五月激情影院| 日婷婷| 欧美激情五月天婷婷| 国内自拍1区| AV在线大香蕉| 丁香色五月婷婷91桃色| 婷婷九月丁香| 人妻中文字幕精品| 国产毛片欧美毛片久久久| 国产成人亚洲综合A∨婷婷| 亚洲激情亚洲激情| 玖玖婷婷视频| 五月Huangsewang| 97在线碰| 十一月婷婷激情四射| 狠狠做六月爱婷婷综合aⅴ| 欧美日韩精品一区二区三区钱| 五月丁香综合网| 六月婷婷久久| tingtingzonghewang| 五月玖玖| 婷婷久久天堂网| 国产人妻人伦精品一区二区| 成人av中文字幕| 五月天艹天天| 婷婷六月丁香色| 97香蕉久久超级碰碰高清版| 任我肏视频精品| 天天日天天操心| 日韩高清成人| 国产精品久久久海的味道| 亚洲爱爱无码婷婷色五月| 五月婷婷五月天| 伊人五月天久久| 天海翼中文字幕高| 国产美女无遮挡裸体毛片A片 | 婷婷午夜| 色噜噜狠狠色综合成人99| 婷婷五月天大香蕉在线视频观看| 日本人妻伦在线中文字幕| 九色婷婷| 99ri在线观看视频| 婷婷久久99| 五月丁香激情综合网| 国产乱妇乱子伦| 日韩激情人伦人| site:xiongshengzz.com| 五月婷婷丁香大陆免费| 亚洲性爱电影| 国产老熟妇亲子乱对白| 99伊人性爱在线影院| 久久久久五月丁香| 天天综合网色欲香| 中文字幕天天干| 国产精品A片在线| 五月天婷a在线| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 99啪啪视频| 婷婷午夜丁香| 第四色激情网| 久久怕怕视频| 97色婷婷| 白人荫道BBWBBB大荫道| 91精品激情9| 日本激情综合| 大香蕉久久久久久久久| 六月婷在线| 国产九九一区二区三区| 成人在线综合| 99re热视频这里只有综合亚洲| 9+1视频网址| 99在线观看视频免费| 婷婷激情五月吧| 丁香婷婷丁香五月欧美人| 成人久久天天x资源站| 天天拍天天做视频| 五月草影视| 色五月婷婷亚洲最大| 狠狠色大香蕉| 五月婷激情| 五月天激情国产综合婷婷婷 | 这里只有精品在线视频在线观看| 日日夜夜天天| 五月婷婷色五月| 亚洲乱码日产精品BD| 色婷婷很很丝袜| 婷婷激情四射五月天| 九色视频91疯狂| 久久婷婷六月| 思思国产99| 午夜成人天堂久久无码日韩久久| 丁香五月激情网| 婷婷五月丁香图片人人操| 久久九⑨| 第四色网婷婷| 亚洲综合色激情色五月| 色五月欧美| 五月婷婷激情综合在线| 五月婷婷啪啪啪啪| 色五月婷婷久久| 国精产品一区一区三区免费视频| 九月av在线| 九月婷婷久久| 激情五月www| 亚洲黄色精品| 97爱艹婷婷开心丁香激情综合| 伊人五月婷婷国产视频| 欧洲亚洲免费视频9| 狠狠搞亚洲| 黄色AV日韩| 久777| 成人av在线电影| 精品人妻久久久久久久| 91超碰人人操| av一区二区电影免费在线观看| 久99热| 99r这里只有精品在线观看| 97超碰人人操| 丁香五月成人自拍| 99高级会所久久| 五月天综合| BBWCUCKOLD精品熟妇| 亚洲99在线| 夜夜夜夜做天天天做无码视频| 五月丁香激| 婷婷的五月天另类视频| 久久这里只有精品5| 五月天.com| 精品成人无码A片观看香草视频| 国产成人高清| 停停五月丁香| 婷婷在线网| 综合激情五月四射婷婷| 99乱视频| 久久资源综合| 亚洲性爱区无码区| 91狠狠色丁香婷婷综合久久| 中文字幕综合| 色婷婷五月天久久| 999热这里只有美国精品| 丁香六月婷婷五月天| 热99在线精品| 色婷婷丁香五月综合| 色色色999| 色综合综合色| 婷婷五月综合色拍| 国产4P视频精品五区| 婷婷五月天激情AV影院| 嫩BBB搡BBBB榛BBBB| 丁香综合婷婷开心激情网| 色婷婷超碰| 1囯产午夜仑鲁鲁| 亚洲丁香五月在线观看| 强壮公让我夜夜高潮A片视频| 九九精品热| 婷婷涩五月| 99ri精品在线| 91碰超| 日本97在线| 色婷久久| 日韩欧美老妇性视频91久久久| 婷婷色五月色| 日韩AV中文字幕在线| 性天天中文网| 9999热在线| 人人摸人人搞| 日韩久久欧亚| 五月精品| 色哟哟精品| 日本精品99网站| 欧美精品999| 色五月综合激情| 91久久婷婷| 婷婷成人视频| 婷婷丁香久久五月综合| 激情五月丁香五月色| 天堂婷婷丁香六月网| 久草婷婷在线| 婷婷五月天成人小说| 九色porny在线观看激情四射| 亚洲五月花| 久九九热| 丁香六月婷婷综合| 99久久a线观| 国产无套精品一区二区| 五月天婷婷视频30| 探花搜索结果 - 黄上黄| 久久99综合网| 蜜桃婷婷五月| 99久久97| 久久丁香五月| 国产伊人五月天| 亚洲欧洲另类图片| 五月丁香性| 色色激情网| 亚洲精品一区中文字幕乱码| 丁香九月婷婷色| 久久9999| 99热99在线| 婷婷丁香五月,狠狠综合| www.五月婷| 五月停亭六月,六月停亭的英语| 日韩一区二区在线播放| 久久免费干| 中文字幕在线免费| 开心久久爱五月天| 五月天堂色色| 天天日天天操心| 丁香五月婷婷欧美成人色图| 色色色区| 久热一区| 久综合色| 综合色色婷婷| 婷婷丁香在线| 色亭亭丁香五月天| 狠狠草在线观看| 天天舔天天摸视频| 91操人| 东北熟女高潮99综合99| 97色欧美| 婷婷五月综合性爱| 啪啪综合网| 五月激情网综合| 色综合九九| 99热午夜精品| 激情五月激情综合网| 婷婷六月五月天综合| 九九av| 99热www| 欧美人与性动交CCOO| 激情综合网色播五月| 五月激激网w'w'w| 五月婷婷激情| 九九成年视频| 少妇性按摩无码中文A片 | 丁香五月花| 久操综合| 天天色,天天日,天天做| 亚洲色五月天是什么| 99资源在线视频| 婷婷97色| av九九| 久久五月激情| 老司机日日夜夜青草| 激情综合网五月天天| 五月丁香六月婷婷啪啪| 91九九热| 666555。COm毛片| 极品人妻VideOssS人妻| 99人妻碰碰碰久久久久视| 激情五月婷婷综合色播小说| 亚洲99激情| 91天天操天天干天天射| 69综合在线| 亚洲区在线| 日韩在线观看网址| 五月色综合| 天天舔天天爽| 日韩成人中文字幕| 五月天丁香成人| 色噜噜狠狠一区二区三区| 五月开心啪啪| 婷婷深爱五月天在线| 五月丁香六月婷婷精品| 丁香婷婷啪啪| 色婷婷欧美| 色婷婷色情| 久久婷婷国产| 色婷婷久久综合久色综| Caop在线| 麻豆精品| 操人精品| 97操碰在线视频| 丁香五月天天| 视频久久9| 啪啪色区| 99噜噜噜| 五月婷婷亚洲| 97碰在线| 色性综合| 国语对白性爱视频播放| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 逼里香不卡| 99在线亚洲| 激情五月丁香五月| 五月婷在线观看| 久久综合中文字幕| 91婷婷在线| 婷婷社区五月天| 人人爱操| 四川BBB搡BBB爽爽视频| 五月天sesese| 牛牛碰免费| 99热成人在线观看| 九九婷婷网五月天| 九月综合| 成人丁香五月| 婷婷成人基地| 久久性都花花世界成人免费视频| 99热亚州综合| 亚洲色图81p| 丁香色五月 97干| 26uuu淫色| 激情九九这里只有精品| 五月天成人综合| 五月婷网| AA片在线观看视频在线播放| 拍色综合| 色婷婷9| 99久久99热| 婷婷综合网站| 五月丁香六月| 婷婷五月激情五月激情| 久久久国产精品黄毛片| 激情电影五月婷婷| 婷婷综合精品| 狠狠色性| 99热这里只有精品国产首页| 亚洲无码11| 激情五月综合网| 精品国产a| 人妻AV在线| 思思精品久久艹 | 激情骚五月| 99色热| 开心五月色婷婷综合开心网| 综合一区二区三区| 无码激情AAAAA片-区区| 五月婷婷国产| www色婷婷久久综合久色 | 千人斩操逼| 激情www| 激情六月婷婷| 成人 九九九九| 天天插天天狠| 色情婷婷五月天| 97啪啪| 丁香六月婷婷社区| 99精品这里只有免费视频| 91午夜激情| www.久久| 91人人澡人人爽人人看| 婷婷五月天视频小说| 人妻激情在线| 五月丁香婷婷欧美色图视频五月丁香777电影 | 美女亚洲五月丁香| 激情五月天影院| 久久久国产精品黄毛片| 26uuu精品一区二区| 婷婷五月天第四色| 婷婷俺去也| 国产AV不卡福利| 色五月婷婷丁香婷婷| 99re在线视频| 琪琪色网址| 激情婷婷内射| 九九re精品视频在线观看| 91 影音先锋| 五月婷婷综合网| 五月天天天天天天天天天天天婷婷婷| 丰满人妻妇伦又伦精品国产| 92久久| 思思热这里只有精品| 欧美69久成人做爰视频| 综合激情伊人影视在线| 99热官网| 精品五月花| 深爱激情网婷婷| 九九热精品视频| 丁香色成人| 97色色色| 久久久五月天婷婷成人网| 第四色婷婷色五月| 五月亭亭开心网| 婷婷色九月| 伊人色综合久久久| 日韩操啪| 99国产这里只有精品| 色婷婷丁香女女| 国产精品久久在线观看技巧| 玖玖资源在线视频| 色婷婷免费视频| 色色色网站| 中文字幕无码成人电影| 六月丁香成人网| 九月婷婷在线视频| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 在线超碰免费| 深爱激情网噜噜色| 秋霞av吧| 色宗合久久五月婷婷| 九八Av| 天天干-天天日| 中国女人内射6XXXXX| 婷婷五月天xxx| 亚洲精品又粗又大又爽A片| 婷婷五月丁香影院| 亚洲乱码日产精品BD在线观看| 色八月婷婷| 少妇大叫太大太粗太爽了A片| WWW·天天操·视频?| 色婷五月天| 久久老码第一| 国产日韩精品SUV| 五月婷丁香在线视频在线| 国产69精品久久久久999小说| 天天爽天天日人人爱| 大地资源色婷婷视频在线| 午夜 外网 精品 在线| 国产日产亚系列精品版优势| 色综合五月婷婷狠狠干| 91re色综合视频| 这里只有精品免费视频| 婷婷久久免费| 99久视频| 色色色在线免费视频| 色色欧美。| 99热这里只有精品在线播放| av成人在线播放| 午夜天堂啪啪| 日本本土色网第一区| 中文字幕无码人妻少妇免费视频| 日本激情五月天‘| 2021日韩无码| 大香蕉婷婷五月天| 久久五月天激情婷婷| 超碰成人黄色网| 强伦轩人妻一区二区电影| 超碰在线观看9| 婷婷成人五月天成人文学| 伊人久久婷婷五月天激情四射| 91re色综合视频| www.yw色| 亚洲 25P| 狠狠综合久久综合| 午夜色婷婷| 色婷綜合网| 婷婷欧美激情| 久久精品性爱| 99精品久久久久久久婷婷久久| 婷婷色片| 无码99| 日韩九九| 99免费视频久久| 亚韩精品视频1区| 丁香五月婷婷色情综合| 婷婷五月天基地| 亚洲激情网站| 国产一级片| 日韩国产AV播放| 中文字幕在线观看视频www| 五月色导航| 操久久精| 无码人妻精品一区二区蜜桃色欲| 99热a片免| 久热这里只有精品性色AV| 色色97丁香婷婷五月天| 99re8这里只有精品99re8热视频| 久99久热只有精品国产99| 色狠狠999综合| 久久艹 五月天| 99九九精品| 亚洲最大五月六月丁香婷婷| 色五月婷婷婷婷婷婷婷婷婷婷| 中文超碰视在线| 色色99| 99色 | 精a品a视a频| 99热大| 日本不卡高字幕在线2019| 热99在线精品| 五月天伊人手机在线播放AV| 激情婷婷| 亚洲一级AV在线免费播放| 久久性爱网| 狠狠狠狠狠干| 婷婷激情人妻| 婷婷中文字暮| 婷婷免费成人视频| 亚洲国产成人综合| 狠爱婷色| 欧美天堂婷婷日韩| 色色五月婷婷| 色婷婷久久久| 女人天堂AV| 久久激情五月天| 五五月五月| 色色日韩| 99re视频在线播放| 97超级碰碰碰| 亚洲黄色操逼| 欧美三级巜人妻互换| 这里只有精品免费视频| 欧美啪啪9| 日日夜夜天天综合| 激情五月,深深爱五月| 亚洲色色爱| 掩去也综合五月视频| 色色五月天网站| www,超碰| 99热 在线播放| 欧美人人草草| 狠狠色综合图片| 97超碰免费超级在线观看| 五月婷婷色| 久久99视频| 精品人妻一区二区| 日日.c| 99热99干| 中文字幕在线免费观看视频| 97人人做| 91九色丨国产丨爆乳| 天堂中文国产| 99热免费精品| 99超级碰碰| 色吧婷婷| 99re视频在线播放| 五月天婷婷网站888| 碰碰人人人| 色色色香蕉五月婷| 亚洲六月色| 97luluse| 亚洲mm免费| 东北熟女高潮99综合99| www.9色色色| 五月丁香中文婷婷中文| 成人短视频免费| 久人操| 激情久久久久久久久久| 婷婷五月丁香综合激情| 色九月婷婷综合| 在线视频你懂得| 婷五月天天| 天天爽,天天操。| 热这里| 亚洲99热| 亚洲视频操| 激情婷婷五月| 99热在线观看| 91免费啪视频| 婷婷久久影院| 国产在线中文字幕| 国产日韩欧美性生活| 激情丁香网| 婷婷操婷婷干婷婷射| 欧美日比视频| 夜夜谢天天干| 亚洲成人影视在线| 免费在线a| 99碰超| 狠狠狠人妻| 999热在线视频| 激情综合网五月| 六月婷婷激情| 久久加勤综合| 九九热精品99| 午夜理论片最新午夜理论剧| 色情久久久| 五月丁香婷婷综合视频| 天天插天天爽| 久热A片| 亚洲综合无码| 五月丁香综合久久| 五月六月婷| 久久婷婷五月综合| 五月情四婷婷| 婷婷深爱五月丁香网| 色五月婷婷基地| www.五月天婷婷| 色五月丁香五| 欧美综合123区| 26UUU欧美激情一区二区| 激情噜噜噜| 99性爱视频| 色原狠狠综合| 秋霞午夜理论| 欧美黄色韩日网| 色综合久| 婷婷天堂视频| 婷婷丁香五月天色区| 人妻久久久久久| 亚洲V国产V欧美V久久久久久| 另类丁香综合| 五月丁香六月欧美综合| 超碰不卡在线| 91 影音先锋| 午夜一区| 热99在线| 爱久久小说下载网| 欧洲不卡视频| 激情亚洲网| 婷婷五月成人| 婷婷激情人妻| 99国产性感视频| 色99在线| 丁香婷婷五月综合影院| 久久九精品| 另类图片五月天| 婷婷七月丁香色色| 色婷五月| 五月天婷婷色| 久热中文字幕| 色婷婷丁香五月在线观看| www.超碰| 久操无码| 婷婷五月天综合在线| av一级棒av| 天天日天天狠狠操| 亚洲成人av在线| 六月婷在线| 婷婷六月色情| 亚洲va综合va国产va中文| 亚洲av免费在线| 欧美这里只有精品| 婷婷丁香五月天之开心少妇| 婷婷六月开心网| 久久视频这里有精品99| 久久婷婷五月天激情四射| 天天xxxxxx天天日| 亚洲视频一区| 激情深爱综合| 婷婷丁香18| 丁香激情网| 五月丁香激情综合啪啪| av五月丁香婷婷网| 丁香五月激情无码视频| 图片区 小说区 区 亚洲五月| 激情五月天婷婷直播| 婷婷五月天堂| 欧美啪啪9| 9l视频自拍九色9l视频在线观看| 亚洲一区二区 成人网站戴套| 99re26视频| 草草夜夜操| 狠狠干在线视频| 日日影院 | 日日鲁鲁夜夜爽爽| 激情婷婷丁香| 电影爱拉战争免费观看| www.夜夜操.com| 99热婷婷| 成人看片网站| 丁香五月天AV在线| 99久久6| 少妇丁香婷婷 | 99五月香婷婷丁香在线视频| 五月丁香六月激情狠狠| 国产午夜精品一区二区三区四区| 精品99久久久久成人网站免费| 色丁香五月婷婷| 77799热| 欧美怡红院黄站| 亚洲欧美另类在线23p| 激情骚五月|