免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

three.js A*尋路實(shí)戰(zhàn):從網(wǎng)格降維到角色自動(dòng)移動(dòng)

three.js A*尋路實(shí)戰(zhàn):從網(wǎng)格降維到角色自動(dòng)移動(dòng) 簡介一套面向WebGL與前端開發(fā)者的three.js算法尋路綜合示例結(jié)合Vue框架搭建可交互的3D場景演示A算法與DFS/BFS遍歷在路徑規(guī)劃中的表現(xiàn)適用于游戲開發(fā)、VR/AR項(xiàng)目中的尋路技術(shù)驗(yàn)證與學(xué)習(xí)。壓縮包共71個(gè)文件其中22個(gè)PNG、16個(gè)SVG、11個(gè)JPG主要承擔(dān)紋理素材與界面圖標(biāo)8個(gè)JS文件與5個(gè)Vue組件負(fù)責(zé)三維邏輯和交互界面另有說明文檔、樣式文件等整體大小約3.56MB結(jié)構(gòu)清晰方便直接運(yùn)行或二次修改。目前已有778人學(xué)習(xí)下載。通過該示例可以掌握three.js構(gòu)建含障礙物的三維場景、Vue管理界面狀態(tài)并讓用戶自由切換算法理解A算法如何結(jié)合啟發(fā)函數(shù)在3D空間中尋找最優(yōu)路徑亦可對照DFS/BFS輸出區(qū)別不同搜索策略的耗時(shí)與路徑質(zhì)量適合希望快速上手WebGL尋路實(shí)戰(zhàn)并兼顧前端工程化細(xì)節(jié)的開發(fā)者。1. three.js 算法尋路示例先讓角色找到路再談走得好不好剛寫完角色移動(dòng)控制的那個(gè)晚上我把速度拉滿想試手感結(jié)果 NPC 一頭撞在墻上推都推不開。前后找了一小時(shí)最后發(fā)現(xiàn)是轉(zhuǎn)向邏輯里少判斷了一步。這是做 three.js 算法尋路示例時(shí)的常態(tài)模型會(huì)跑不會(huì)找路。真正能落地的方案不是去調(diào)大量轉(zhuǎn)向邏輯而是把尋路從 3D 空間降維成 2D 問題用規(guī)則網(wǎng)格表示地圖可走性用 A* 求出路徑點(diǎn)再讓角色沿著路徑點(diǎn)移動(dòng)。接下來按這條路線我給出一份可直接照做的 three.js 實(shí)現(xiàn)覆蓋選型、代碼和避坑適合剛把 three.js 基礎(chǔ)跑通、想讓 NPC 或玩家角色自動(dòng)找路的開發(fā)者。2. 為什么先用 2D 網(wǎng)格尋路three.js 里的算法選型與降維思路2.1 三種地圖表示對比網(wǎng)格搜索、導(dǎo)航網(wǎng)格與路點(diǎn)圖在開始敲代碼前先明確一件事three.js 本身不提供尋路能力它只負(fù)責(zé)渲染。尋路要在它外面算好路徑再把路徑數(shù)據(jù)喂給場景里的對象。最常見的三種做法是規(guī)則網(wǎng)格搜索、導(dǎo)航網(wǎng)格和路點(diǎn)圖。網(wǎng)格搜索是把地面切成等大的格子每個(gè)格子標(biāo)記可走或不可走然后跑圖搜索算法導(dǎo)航網(wǎng)格是用凸多邊形把可走區(qū)域包裹起來在這些多邊形上做圖搜索路點(diǎn)圖則是手工在場景里放若干個(gè)路標(biāo)點(diǎn)連成圖再搜索。三種方式的選擇直接決定后面開發(fā)量參考對比如下對比維度網(wǎng)格搜索導(dǎo)航網(wǎng)格路點(diǎn)圖three.js 落地難度最低網(wǎng)格可直接對應(yīng)數(shù)組中等需要生成和烘焙最低路徑質(zhì)量折線需要平滑貼合地形平滑度高取決于路點(diǎn)密度動(dòng)態(tài)障礙處理需要更新網(wǎng)格數(shù)據(jù)需要更新導(dǎo)航網(wǎng)格難以動(dòng)態(tài)處理適用場景中小型固定地圖大型復(fù)雜地形簡單原型演示如果你的項(xiàng)目是中小場景、障礙物數(shù)量可控我建議先用網(wǎng)格搜索把主流程跑通。這是多數(shù) three.js 尋路項(xiàng)目的起步方案也是本文后面代碼采用的方式。導(dǎo)航網(wǎng)格質(zhì)量更高但它引入的生成工具鏈、離線烘焙和動(dòng)態(tài)維護(hù)復(fù)雜度對初版來說負(fù)擔(dān)不小。把網(wǎng)格搜索做好以后換導(dǎo)航網(wǎng)格也容易因?yàn)?A* 搜索邏輯可以復(fù)用。網(wǎng)上討論時(shí)很多人把「導(dǎo)航網(wǎng)格」和「尋路算法」混為一談其實(shí)它們是兩件事導(dǎo)航網(wǎng)格是地圖的數(shù)據(jù)結(jié)構(gòu)A* 是跑在這個(gè)圖上的搜索算法。理解這一點(diǎn)再看各種資料會(huì)順很多。2.2 降維到 XZ 平面對 three.js 意味著什么three.js 世界坐標(biāo)里 Y 軸朝上地面上的普通尋路只關(guān)心水平方向的移動(dòng)。把三維坐標(biāo)直接放進(jìn) A* 是很吃虧的搜索空間從二維多出一層 Y 方向維度路徑會(huì)繞到空中而且計(jì)算量成倍增加。所以常規(guī)做法是尋路計(jì)算限制在 XZ 平面算完后把網(wǎng)格坐標(biāo)恢復(fù)成 Y0或通過高度采樣得到真實(shí) Y 值的世界坐標(biāo)。這里有個(gè)容易被忽視的細(xì)節(jié)場景地形如果是起伏的不能直接把 Y 設(shè)成 0否則角色會(huì)走進(jìn)地面。我一般會(huì)在路徑生成后做一次高度采樣// 從地形幾何中采樣 Y 值 function getHeightAt(x, z) { const raycaster new THREE.Raycaster(); raycaster.set(new THREE.Vector3(x, 100, z), new THREE.Vector3(0, -1, 0)); const hit raycaster.intersectObject(terrainMesh); return hit.length ? hit[0].point.y : 0; }這段代碼把射線從高空垂直向下打取第一個(gè)交點(diǎn)作為地面高度。這樣網(wǎng)格尋路只管 XZ最后再把 Y 填上既保留算法效率又適配了起伏地形。多層建筑的做法是拆成多個(gè)水平層每層一張獨(dú)立的 XZ 網(wǎng)格層間用樓梯或電梯點(diǎn)銜接。新手最常見的翻車是把樓板和樓梯全部丟進(jìn)一個(gè)三維網(wǎng)格里搜出來的路徑又慢又怪我見過某個(gè)項(xiàng)目把三維網(wǎng)格邊長調(diào)到 0.1尋路一次要半秒完全無法實(shí)時(shí)使用。2.3 定參數(shù)再寫代碼網(wǎng)格邊長、鄰域、啟發(fā)式與移動(dòng)代價(jià)這四個(gè)參數(shù)決定尋路效率和路徑質(zhì)量建議在寫代碼前就定好。網(wǎng)格邊長單位是 three.js 場景坐標(biāo)。常見初始值是 0.5 或 1。邊長越小路徑越精細(xì)但格子數(shù)量按平方增長A* 的開銷也隨之變大。0.25 以下的邊長適合幾十米范圍的小場景超過 100 米的地圖就建議緩存或換導(dǎo)航網(wǎng)格。做示例時(shí) 0.5 是平衡點(diǎn)障礙物邊界誤差在可接受范圍內(nèi)10×10 的場景只有 400 個(gè)格子A* 跑一次幾乎無感。鄰域4 鄰域只允許上下左右走路徑簡單無斜穿但看起來生硬8 鄰域允許斜向路徑更自然代價(jià)是允許對角穿墻后面避坑章節(jié)會(huì)補(bǔ)判斷。真實(shí)項(xiàng)目里超過 90% 會(huì)選 8 鄰域因?yàn)榻巧敝吒鲿?。啟發(fā)函數(shù)4 鄰域選曼哈頓距離8 鄰域選切比雪夫或歐幾里得距離。啟發(fā)必須小于等于真實(shí)代價(jià)否則尋路會(huì)退化成貪心路徑明顯變差。移動(dòng)代價(jià)正交移動(dòng)為 1斜向?yàn)镸ath.SQRT2約 1.414。不區(qū)分會(huì)讓路徑走向發(fā)飄搜索順序也不穩(wěn)定。完成這些參數(shù)設(shè)置后就可以進(jìn)入代碼了。常見做法是先寫一個(gè)純 JavaScript 的 A* 模塊它完全不知道 three.js 存在再寫坐標(biāo)轉(zhuǎn)換層把網(wǎng)格路徑換算成世界坐標(biāo)。兩者分開后算法單元測試好寫網(wǎng)格邏輯出錯(cuò)能立刻定位。我一般把 A* 放在astar.js把 three.js 初始化和動(dòng)畫放在主文件這樣數(shù)據(jù)與渲染解耦后面換導(dǎo)航網(wǎng)格也不用重寫核心算法。3. 搭建 three.js 尋路場景從空場景到可走性網(wǎng)格數(shù)據(jù)3.1 初始化場景和軌道控制器調(diào)試視角怎么搭先寫一個(gè)最基礎(chǔ)的三維場景固定好一個(gè)便于觀察的初始視角。import * as THREE from three; import { OrbitControls } from three/addons/controls/OrbitControls.js; let scene, camera, renderer, controls; function initScene() { scene new THREE.Scene(); scene.background new THREE.Color(0x222222); camera new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200); camera.position.set(14, 10, 14); camera.lookAt(0, 0, 0); renderer new THREE.WebGLRenderer({ antialias: true }); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); controls new OrbitControls(camera, renderer.domElement); controls.target.set(0, 0, 0); const ambient new THREE.AmbientLight(0xffffff, 0.6); scene.add(ambient); const dir new THREE.DirectionalLight(0xffffff, 0.8); dir.position.set(5, 10, 7); scene.add(dir); // 網(wǎng)格輔助線方便核對格子的實(shí)際邊界 const gridHelper new THREE.GridHelper(20, 40, 0xcccccc, 0x555555); scene.add(gridHelper); renderer.setAnimationLoop(animate); } function animate() { controls.update(); renderer.render(scene, camera); } initScene();邏輯說明固定初始視角加軌道控制器的目的是為了在調(diào)試時(shí)隨時(shí)旋轉(zhuǎn)觀察路徑點(diǎn)與障礙物的貼合程度。GridHelper把地面按每格 0.5 單位畫出網(wǎng)格線正好對應(yīng)我們后面設(shè)定的網(wǎng)格邊長 0.5能直觀看出「格子」與「障礙物」的邊界關(guān)系。燈光用環(huán)境光加方向光組合避免場景過暗影響判斷。setAnimationLoop比requestAnimationFrame更適合 WebXR 和需要幀率控制的場景。參數(shù)說明camera.position.set(14, 10, 14)讓相機(jī)位于場景對角線上方透視效果能同時(shí)看到 X 和 Z 兩個(gè)方向的延伸。GridHelper(20, 40)表示總長 20每邊 40 格。如果后面把網(wǎng)格邊長改成 1輔助線的分割數(shù)也要改成 20否則看不出格子邊界調(diào)試會(huì)非常吃力。3.2 生成障礙物與包圍盒把場景對象變成尋路數(shù)據(jù)尋路邏輯其實(shí)不關(guān)心渲染它只關(guān)心「哪里能走」。障礙物的 Box3 包圍盒就是最直接的攔路數(shù)據(jù)。// 記錄所有動(dòng)態(tài)障礙物 const obstacles []; function createBoxObstacle(x, z, w, h, d) { const geo new THREE.BoxGeometry(w, h, d); const mat new THREE.MeshStandardMaterial({ color: 0xcc5522, roughness: 0.7 }); const mesh new THREE.Mesh(geo, mat); mesh.position.set(x, h / 2, z); // 底部貼地 scene.add(mesh); // 統(tǒng)一保存包圍盒后續(xù)網(wǎng)格標(biāo)記直接用 mesh.userData.bounds new THREE.Box3().setFromObject(mesh); obstacles.push(mesh); // 調(diào)試畫出包圍盒確認(rèn)阻擋范圍 const boxHelper new THREE.BoxHelper(mesh, 0xffaa00); scene.add(boxHelper); return mesh; } // 示例場景三堵墻和一個(gè)方塊 createBoxObstacle(-2, -1, 4, 1.5, 0.6); createBoxObstacle(1, 2, 0.6, 1.5, 3); createBoxObstacle(4, 0, 2, 1, 2);邏輯說明BoxHelper會(huì)繪制障礙物的包圍盒線框。A* 尋路不需要場景對象只需要每個(gè)障礙物在 XZ 平面的投影范圍。我把包圍盒存進(jìn)userData.bounds生成網(wǎng)格時(shí)就不用遍歷場景里所有 Object3D只遍歷這個(gè)obstacles數(shù)組即可。參數(shù)說明h / 2是因?yàn)锽oxGeometry的中心在幾何體中心要讓底部貼地必須把 Y 上移半高。障礙物數(shù)量少時(shí)逐個(gè)創(chuàng)建完全夠用如果場景里有幾百個(gè)障礙建議直接用一個(gè)數(shù)組保存包圍盒數(shù)據(jù)跳過 Mesh 創(chuàng)建因?yàn)閷ぢ凡魂P(guān)心渲染層這樣能省掉大量 GPU 內(nèi)存占用。3.3 生成二維網(wǎng)格把障礙物投影到可走性數(shù)組現(xiàn)在把場景地圖拆成一個(gè)二維數(shù)組。數(shù)組的行對應(yīng) Z 方向列對應(yīng) X 方向值 1 表示障礙。const GRID_SIZE 0.5; // 每格邊長 const MAP_WIDTH 10; // X 方向范圍 const MAP_DEPTH 10; // Z 方向范圍 const GRID_COLS Math.ceil(MAP_WIDTH / GRID_SIZE); const GRID_ROWS Math.ceil(MAP_DEPTH / GRID_SIZE); // walkableGrid[row][col]1 表示障礙物0 表示可走 const walkableGrid Array.from({ length: GRID_ROWS }, () Array.from({ length: GRID_COLS }, () 0) ); function buildWalkableGrid() { for (let r 0; r GRID_ROWS; r) { for (let c 0; c GRID_COLS; c) { walkableGrid[r][c] 0; // 重置 const x c * GRID_SIZE GRID_SIZE / 2 - MAP_WIDTH / 2; const z r * GRID_SIZE GRID_SIZE / 2 - MAP_DEPTH / 2; const testPoint new THREE.Vector3(x, 0, z); for (const obstacle of obstacles) { const b obstacle.userData.bounds; // 包圍盒投影到 XZ 平面只看水平范圍 if (x b.min.x x b.max.x z b.min.z z b.max.z) { walkableGrid[r][c] 1; break; } } } } } buildWalkableGrid();邏輯說明這里取格子中心點(diǎn)判斷它是否落在障礙物包圍盒的水平投影范圍內(nèi)。行號對應(yīng) Z、列號對應(yīng) X是因?yàn)閟etFromObject返回的 Box3 是世界坐標(biāo)。后續(xù)我們把網(wǎng)格坐標(biāo)轉(zhuǎn)回世界坐標(biāo)時(shí)必須按同一套約定否則路徑會(huì)橫向反轉(zhuǎn)或前后來回錯(cuò)亂。參數(shù)說明GRID_SIZE是尋路的空間分辨率它必須和障礙物最小厚度匹配。如果墻厚 0.6 而網(wǎng)格邊長是 0.5格子中心可能落在墻外 0.3 的位置導(dǎo)致角色走到墻和障礙之間的夾縫里。安全做法是讓GRID_SIZE小于等于障礙物最小厚度的一半或者判斷時(shí)把包圍盒向外擴(kuò)半格。我在避坑章節(jié)會(huì)詳細(xì)展開這里先知道有這個(gè)隱患就好。4. 在 three.js 里實(shí)現(xiàn) A* 并驅(qū)動(dòng)角色移動(dòng)4.1 純 JavaScript A* 實(shí)現(xiàn)開集合、閉集合與啟發(fā)式A* 模塊不依賴 three.js這樣純算法邏輯可以單獨(dú)測試。代碼里我用開集合存待考察節(jié)點(diǎn)用cameFrom記錄前驅(qū)用gScore和fScore做代價(jià)評估。// astar.js —— 純算法模塊不依賴 three.js function heuristic(a, b) { // 八鄰域使用切比雪夫距離避免高估真實(shí)代價(jià) return Math.max(Math.abs(a.r - b.r), Math.abs(a.c - b.c)); } function aStar(grid, start, end) { const rows grid.length; const cols grid[0].length; const key (r, c) r * cols c; const openSet []; const cameFrom new Map(); const gScore new Map(); const fScore new Map(); gScore.set(key(start.r, start.c), 0); fScore.set(key(start.r, start.c), heuristic(start, end)); openSet.push(start); while (openSet.length 0) { // 每次取 fScore 最小的節(jié)點(diǎn)線性掃描即可 let bestIdx 0; for (let i 1; i openSet.length; i) { if (fScore.get(key(openSet[i].r, openSet[i].c)) fScore.get(key(openSet[bestIdx].r, openSet[bestIdx].c))) { bestIdx i; } } const current openSet[bestIdx]; openSet.splice(bestIdx, 1); if (current.r end.r current.c end.c) { return reconstructPath(cameFrom, current, cols); } // 八方向鄰居 const dirs [ [1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1], ]; for (const [dr, dc] of dirs) { const nr current.r dr; const nc current.c dc; if (nr 0 || nr rows || nc 0 || nc cols) continue; if (grid[nr][nc] 1) continue; // 障礙不可走 // 八鄰域穿墻檢查斜向移動(dòng)時(shí)拐角兩側(cè)都必須可走 if (dr ! 0 dc ! 0) { if (grid[current.r][nc] 1 || grid[nr][current.c] 1) continue; } const moveCost (dr ! 0 dc ! 0) ? Math.SQRT2 : 1; const tentativeG (gScore.get(key(current.r, current.c)) ?? Infinity) moveCost; const nk key(nr, nc); if (!gScore.has(nk) || tentativeG gScore.get(nk)) { cameFrom.set(nk, current); gScore.set(nk, tentativeG); fScore.set(nk, tentativeG heuristic({ r: nr, c: nc }, end)); if (!openSet.some(n n.r nr n.c nc)) { openSet.push({ r: nr, c: nc }); } } } } return null; // 沒有可達(dá)路徑 } function reconstructPath(cameFrom, current, cols) { const path [current]; let cur current; while (cameFrom.has(cur.r * cols cur.c)) { cur cameFrom.get(cur.r * cols cur.c); path.push(cur); } return path.reverse(); }邏輯說明openSet每次取 fScore 最小的節(jié)點(diǎn)節(jié)點(diǎn)少時(shí)線性掃描完全夠用。cameFrom用 Map 存前驅(qū)鍵是行 * 列數(shù) 列避免把整個(gè)對象當(dāng)鍵造成內(nèi)存浪費(fèi)。八鄰域穿墻檢查是這段代碼里最關(guān)鍵的細(xì)節(jié)從(r, c)斜向(r1, c1)時(shí)必須確認(rèn)(r, c1)和(r1, c)都不是墻否則路徑會(huì)貼著墻角斜切運(yùn)行時(shí)視覺上非常怪。參數(shù)說明Math.SQRT2是內(nèi)置常量保證斜向移動(dòng)代價(jià)為 1.414啟發(fā)函數(shù)用切比雪夫距離在八鄰域下不會(huì)高估真實(shí)代價(jià)搜索方向也會(huì)更偏向目標(biāo)。?? Infinity用于gScore尚未賦值的節(jié)點(diǎn)未探索節(jié)點(diǎn)代價(jià)視為無窮大。如果節(jié)點(diǎn)數(shù)量超過 5000建議把openSet改成二叉堆避免每次線性掃全集合否則單次搜索可能突破幾十毫秒。4.2 網(wǎng)格坐標(biāo)與世界坐標(biāo)互轉(zhuǎn)偏置必須成對出現(xiàn)A* 算出來的結(jié)果是網(wǎng)格行列號喂給 three.js 角色前必須轉(zhuǎn)成世界坐標(biāo)。轉(zhuǎn)換函數(shù)要保證偏移邏輯一致。function worldToGrid(x, z) { const col Math.floor((x MAP_WIDTH / 2) / GRID_SIZE); const row Math.floor((z MAP_DEPTH / 2) / GRID_SIZE); // 防止越界索引直接夾回有效范圍 return { r: Math.min(GRID_ROWS - 1, Math.max(0, row)), c: Math.min(GRID_COLS - 1, Math.max(0, col)), }; } function gridToWorld(row, col) { const x col * GRID_SIZE GRID_SIZE / 2 - MAP_WIDTH / 2; const z row * GRID_SIZE GRID_SIZE / 2 - MAP_DEPTH / 2; // 高度默認(rèn)填 0起伏地形請用 getHeightAt 采樣真實(shí) Y return new THREE.Vector3(x, 0, z); } const start worldToGrid(-2, -3); const end worldToGrid(3, 2); const gridPath aStar(walkableGrid, start, end); const worldPath (gridPath || []).map(p gridToWorld(p.r, p.c));邏輯說明worldToGrid把世界坐標(biāo)平移到地圖中心后除以格子邊長并向下取整。格子中心是col * GRID_SIZE GRID_SIZE / 2起點(diǎn)在-MAP_WIDTH / 2這個(gè)偏置必須同時(shí)出現(xiàn)在正向和反向兩個(gè)函數(shù)里否則路徑會(huì)整體偏移半格看起來就像角色總是貼著障礙物邊緣走。參數(shù)說明worldToGrid里的Math.max(0, row)是防止角色點(diǎn)到地圖外時(shí)出現(xiàn)負(fù)索引。實(shí)際項(xiàng)目中如果不做夾取A* 會(huì)直接越界然后崩潰這個(gè)問題非常隱蔽。gridToWorld的 Y 值默認(rèn)設(shè)為 0如果你的地圖有起伏這里要調(diào)用 2.2 節(jié)的getHeightAt(x, z)去采樣真實(shí)高度。4.3 創(chuàng)建角色并沿路徑移動(dòng)速度與到達(dá)判定有了世界坐標(biāo)路徑還需要一個(gè)占位角色和逐幀移動(dòng)邏輯。// 創(chuàng)建一個(gè)占位角色用圓柱體表示 const player new THREE.Mesh( new THREE.CylinderGeometry(0.3, 0.3, 0.8, 8), new THREE.MeshStandardMaterial({ color: 0x33ccff }) ); player.position.set(-2, 0.4, -3); scene.add(player); let pathIndex 0; const moveSpeed 3; // 場景單位 / 秒 function updatePlayer(playerMesh, pathWorld, delta) { if (pathIndex pathWorld.length) return; const target pathWorld[pathIndex]; const toTarget new THREE.Vector3().subVectors(target, playerMesh.position); const distance toTarget.length(); if (distance 0.05) { // 達(dá)到當(dāng)前目標(biāo)點(diǎn)切換到下一個(gè) pathIndex; } else { const step Math.min(moveSpeed * delta, distance); toTarget.normalize().multiplyScalar(step); playerMesh.position.add(toTarget); playerMesh.lookAt(target); } } const clock new THREE.Clock(); function animate() { const delta clock.getDelta(); updatePlayer(player, worldPath, delta); controls.update(); renderer.render(scene, camera); }邏輯說明updatePlayer向量化的方式是new THREE.Vector3().subVectors(target, position)得到從角色指向目標(biāo)點(diǎn)的向量。用Math.min(moveSpeed * delta, distance)限制單幀移動(dòng)量可以避免角色在高速移動(dòng)時(shí)直接越過路徑點(diǎn)來回?cái)[動(dòng)。lookAt讓角色的正前方朝向目標(biāo)。參數(shù)說明0.05是到達(dá)判定半徑。路徑點(diǎn)密集時(shí)這個(gè)值要調(diào)小否則角色會(huì)在拐彎前提前轉(zhuǎn)向速度越快判定值要適當(dāng)調(diào)大否則角色會(huì)錯(cuò)過目標(biāo)點(diǎn)。clock.getDelta()在setAnimationLoop回調(diào)里獲取是 WebXR 和普通動(dòng)畫循環(huán)都適用的一幀間隔。速度3意味著每秒移動(dòng) 3 個(gè)場景單位在實(shí)際項(xiàng)目里一般會(huì)換算成玩家配置屬性方便調(diào)參。5. 避坑指南three.js 尋路的 5 個(gè)常見問題與排查5.1 網(wǎng)格邊長大于障礙物寬度導(dǎo)致穿?,F(xiàn)象尋路結(jié)果明明繞開了障礙但角色移動(dòng)時(shí)還是卡在墻邊或穿到墻里。原因GRID_SIZE比障礙物厚度還大格子的中心點(diǎn)可能落在障礙物之外但格子的面積同時(shí)覆蓋了障礙物邊緣導(dǎo)致路徑貼著墻走。解決把障礙物包圍盒向外擴(kuò)展半個(gè)格再判斷。最簡單的方式是在buildWalkableGrid里讓b.min.x - GRID_SIZE / 2b.max.x GRID_SIZE / 2Z 方向同理。更嚴(yán)謹(jǐn)?shù)淖龇ㄊ前呀巧霃揭布舆M(jìn)擴(kuò)展量確保角色模型不會(huì)和障礙物產(chǎn)生視覺交叉。5.2 八鄰域未做穿墻檢查路徑斜切墻角現(xiàn)象路徑會(huì)從一個(gè)墻角斜著切過去運(yùn)行時(shí)角色明顯被碰撞擋住但尋路結(jié)果卻一直選這條路。原因八鄰域允許對角移動(dòng)卻沒有檢查拐角兩側(cè)的三個(gè)格子尤其是對角相鄰的兩個(gè)格子。斜向移動(dòng)時(shí)路徑從墻角的頂點(diǎn)穿過去了。解決在擴(kuò)展鄰居時(shí)增加穿墻檢測也就是 4.1 節(jié)代碼里的if (grid[current.r][nc] 1 || grid[nr][current.c] 1) continue。缺少這一步任何八鄰域?qū)ぢ范紩?huì)出現(xiàn)「抄近路」問題。這類問題很多人第一天發(fā)現(xiàn)不了等角色一多就開始穿模屬于最容易翻車的隱藏坑。5.3 路徑點(diǎn)過密角色高頻轉(zhuǎn)向像「抽風(fēng)」現(xiàn)象角色移動(dòng)時(shí)每個(gè)格點(diǎn)都轉(zhuǎn)一次方向視覺上像小步亂戳轉(zhuǎn)彎不自然。原因A* 在網(wǎng)格上輸出的路徑包含大量相鄰格點(diǎn)每個(gè)格點(diǎn)都做了一次轉(zhuǎn)向。格點(diǎn)間距小于角色步長時(shí)轉(zhuǎn)向頻率就非常高。解決對路徑做一次「視線剔除」。從當(dāng)前點(diǎn)出發(fā)嘗試直接連線到更遠(yuǎn)的路徑點(diǎn)如果直線經(jīng)過的格子全部可走就跳過中間的格點(diǎn)。簡化后路徑點(diǎn)數(shù)通常能減少 60% 以上再配合下一章的曲線平滑移動(dòng)觀感會(huì)干凈很多。判斷直線是否可走可以采樣直線上多個(gè)點(diǎn)逐一檢查所在格子的可走性。5.4 動(dòng)態(tài)障礙刷新走全量幀率突然暴跌現(xiàn)象某個(gè)障礙物被移動(dòng)后整個(gè)尋路系統(tǒng)卡頓 1 到 2 秒。原因buildWalkableGrid每次全量重建O(行 × 列) 加上每個(gè)格子遍歷障礙物幾千個(gè)格子的場景重跑一次就掉幀了。解決不要每次移動(dòng)都全量重建改為局部更新。靜態(tài)部分提前烘焙進(jìn)網(wǎng)格動(dòng)態(tài)障礙只在自身包圍盒覆蓋的格子范圍內(nèi)改寫。如果場景實(shí)在很小、格子不超過幾百個(gè)全量重建也能接受但GRID_SIZE不要低于 0.25否則格子數(shù)量會(huì)突增到上萬個(gè)任何手機(jī)瀏覽器都會(huì)卡。這個(gè)坑在 PC 上可能不明顯移動(dòng)端一測就露餡。5.5 把 Y 軸混進(jìn)搜索維度的「飛天」繞路現(xiàn)象兩點(diǎn)在同一水平面路徑卻先高后低甚至從半空中繞過去角色移動(dòng)時(shí)像在飛。原因?qū)ぢ肪W(wǎng)格被做成了三維數(shù)組把 Y 也放進(jìn)搜索空間。three.js 的 Y 軸是高度方向直接搜三維網(wǎng)格會(huì)把現(xiàn)實(shí)中不可達(dá)的區(qū)域也納入候選。解決約定所有尋路都發(fā)生在 XZ 平面。分樓層場景就拆多層每層做一次二維 A*層與層之間用樓梯或電梯點(diǎn)銜接。如果必須支持坡道建議改用導(dǎo)航網(wǎng)格不要硬磕三維網(wǎng)格 A*。這個(gè)問題我在 2.2 小節(jié)已經(jīng)提過但實(shí)際項(xiàng)目里還是會(huì)反復(fù)出現(xiàn)歸根結(jié)底是因?yàn)楹芏嗳四玫絼?dòng)態(tài)角色高度就順手塞進(jìn)了尋路入?yún)ⅰ?. 進(jìn)階技巧路徑平滑與角色朝向讓尋路結(jié)果不呆板6.1 用 CatmullRomCurve3 把折線路徑變成平滑曲線路徑簡化后還是折線段直接讓角色沿折線移動(dòng)會(huì)出現(xiàn)硬轉(zhuǎn)彎。常見做法是用 three.js 內(nèi)置的CatmullRomCurve3做曲線插值const curve new THREE.CatmullRomCurve3(waypoints); const pointsOnCurve curve.getPoints(50); // 采樣 50 個(gè)點(diǎn) const lineGeo new THREE.BufferGeometry().setFromPoints(pointsOnCurve); const lineMat new THREE.LineBasicMaterial({ color: 0x00ff88 }); scene.add(new THREE.Line(lineGeo, lineMat));waypoints是 4.2 節(jié)得到的worldPath數(shù)組。CatmullRomCurve3默認(rèn)穿過每個(gè)傳入點(diǎn)同時(shí)把拐角拉圓角色沿著pointsOnCurve走就不會(huì)出現(xiàn)直角急轉(zhuǎn)。注意曲線可能會(huì)把路徑拉向障礙物一側(cè)所以簡化后的 waypoints 周圍要保留至少一個(gè)格子的余量或者把轉(zhuǎn)彎點(diǎn)稍微向可走區(qū)域中心偏移。6.2 用四元數(shù)插值替代 lookAt轉(zhuǎn)身更自然當(dāng)角色移動(dòng)速度較快時(shí)直接lookAt(target)每幀轉(zhuǎn)向很生硬。用四元數(shù)插值可以讓轉(zhuǎn)身帶有慣性感const targetQuat new THREE.Quaternion().setFromUnitVectors( new THREE.Vector3(0, 0, 1), dir.clone().normalize() ); player.quaternion.slerp(targetQuat, 0.1);參數(shù)說明slerp系數(shù) 0.1 表示每幀朝目標(biāo)方向轉(zhuǎn) 10%系數(shù)越小越慢0.15 到 0.2 的手感更跟手。注意dir必須是在 XZ 平面歸一化后的方向向量否則角色會(huì)低頭或仰頭。模型面部朝向如果默認(rèn)是 X 軸正方向需要先給模型套一個(gè)父級 Object3D 做軸向修正這是 three.js 角色動(dòng)畫里最常見的玄學(xué)問題我也踩過。6.3 驗(yàn)證尋路結(jié)果的三個(gè)檢查項(xiàng)調(diào)試尋路時(shí)我會(huì)??慈齻€(gè)值路徑總長度、轉(zhuǎn)向次數(shù)、最小障礙物距離。路徑總長度能反映鄰域設(shè)置是否合理轉(zhuǎn)向次數(shù)多說明平滑不足最小障礙物距離用于檢查是否有貼邊現(xiàn)象。把這三個(gè)值打印出來對比調(diào)整GRID_SIZE和鄰域比肉眼盯著屏幕猜問題可靠得多。經(jīng)歷過一次「鄰域改成八鄰域后路徑長度降了 30%但出現(xiàn)十幾處貼邊斜切」的事故后我把穿墻檢測、路徑簡化和 slerp 朝向插值固定成了尋路工具的標(biāo)配?;乜催@個(gè) three.js 算法尋路示例初版不要急著追求花哨的動(dòng)態(tài)避讓先把「網(wǎng)格 → A* → 坐標(biāo)互轉(zhuǎn) → 路徑移動(dòng)」這條鏈路跑通再逐步加復(fù)雜度。這個(gè)方向值不值得投入取決于你的項(xiàng)目里有多少個(gè)需要自動(dòng)尋路的角色角色一多網(wǎng)格那套很快會(huì)遇到性能瓶頸到時(shí)候自然會(huì)把視線轉(zhuǎn)向?qū)Ш骄W(wǎng)格。你在網(wǎng)格方案里踩過的那些坑換導(dǎo)航網(wǎng)格時(shí)還會(huì)再遇到一遍。我后來養(yǎng)成了每個(gè)尋路改動(dòng)先打印路徑統(tǒng)計(jì)的習(xí)慣省掉了大量深夜調(diào)試時(shí)間。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91久久婷婷| 天天操夜夜夜夜爽| 天天综合网在线| 国产亚洲99久久精品熟女| 激情婷婷五月天在线观看| 丁香五月天堂网| 少妇丁香婷婷 | 99在线资源| 九九干视频| 日熟女| 色婷婷文字幕| 26uuu国产| 天天天天天天天干| 亚洲AV无码电影| 亚洲五月色| 果冻传媒A片一二三区| 影音先锋人妻出差| 久久婷婷久久| 婷婷五月天涩涩| www.9797国产| 色婷婷精| 99操视频| 99精品免费欧美小视频| 国产成人精品一区二三区熟女在线| 色五月婷婷在线| 五月天激情国产综合婷婷婷| 99亚洲精品综合在线| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 日熟女| 日本老女人黄页在线播放| 日日干夜夜撸夜夜骑| www夜夜| 成人看片网站| 无码一级片| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 91超级碰在线视频| 久久免费婷婷视频| 无码日本精品XXXXXXXXX| 97久操| 丁香六月婷婷一区| 五月天丁香成人| http:色情日本com| 国产婷婷色五月| 婷婷五月天狠狠搞干| 久久激情天堂| 亚洲色网址| 五月天激情四射| www.一起草av| 五月丁香久久呀| 91视频精品99| 男人天堂AV在线一区二区| 国产伊人五月天| 天天激情欧美美女| 九色在线五月婷婷网址| 久久ER视频com| 婷婷色片| 五月婷婷之综合激情在线| 色婷婷五月天亚洲 | 亚洲成人AV在线播放| 激情婷婷内射| 久操大香蕉| 婷婷五月精品中文字幕| 激情五月婷婷色色| 色婷婷五月天不卡| 操操操B| 超碰91在线| 五月亭亭直播| 久久ri精品视频| 天天操夜夜爽天天操| 99热精品在这里| 日本精品人妻无码77777| 婷婷激情四射五月天| 久久久久亚洲A∨成人乱码电影| 久久婷婷五月综合啪| 久久久久久久久久久-久五月天婷婷| 超碰人人射| 天天狠狠六月婷丁香影院| 国产亚洲精品AAAAAAA片| 丁乡久久| 日本九婷婷| 五月丁香网站| 天天干在线播放| 国产.亚洲.欧洲视频在线| 亚洲日韩一页精品发布| 国产婷婷综合| 九九无码AV| 五月丁香六月婷综合成人综合| www.cao.com久久| 狠狠狠狠狠狠色| 久热伊人| 色婷婷社区| 欧美三级巜人妻互换| 狠狠狠狠狠狠草| 亚洲第一色色色色| 欧美成人AAA片一区国产精品| 国产成人AV在线| 久久玖玖综合| 免费97碰碰| 天天成人综合视频| 丁香婷婷五月激情四射网| va婷婷在线| 五月天久久婷婷| 另类激情五月| 99热官网精品在线| site:jszngf.com| 26uuu成人网| 激情综合区| 激情综合国产| 9|无码久久久久久| 日本丁香五月| 久久五月网| 开心五月婷婷| 五月丁香色婷婷熟女| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 欧美97p| 久久久国产精品黄毛片| 色色网站免费观看| 69人人操人人爽| 婷婷视频在线| 超碰在线免费9| 亚洲激情综| 色蜜婷婷| 粉嫩av懂色av蜜臀av熟妇| 99在线资源| www.jiujiujiu| www.婷婷,com| 丁香五月手机在线| 思思热在线精品视频网站| 高清一区二区三区日本久| 亚洲丁香五月综合| 99人人爽| 丁香五月婷婷俺也要去| 色色婷婷色色| 日本99久久| 五月丁香A片| 激情六月天| 播五月婷婷开心| 91精品91久久久中77777| 五月婷婷色播网| 亚洲乱码日产精品BD| 99福利视频| av一区免费看| 99无码超碰| 国产 码在线成人网站| 国产67194| 五月天成人伊人| 色www99| 婷婷五月六月| 欧美色色色色色色色| 97色操| 黄色三级日本| 国产欧美性成人精品午夜| 79色色免费| 日韩一本操| 99热情这里只有精品在线播放 | 丁香激情合作五月| 人妖色AV色综合| 五月丁香精品| www.狠狠干com| 婷五月天| 99视频只有精品| 91无码视频| 精品久久人妻| 久热a| 亚洲人妻电影| 亚洲中文字幕网| 五月丁激情| 激情五月婷婷色色| 四色永久成人网站| 裸体美女丁香五月天。| 婷婷丁香视频在线观看免费| 久久天堂女人| 色偷偷五月天| 人。妻久久| www,久久久| 夫妇交换刺激做爰| 久久狼人天堂| 久er7久热| 午夜亚洲AV日韩无码| 色欧洲| 五月丁香久久呀| 婷婷丁香熟妇综合网| www一区二区三区| 九九热大香蕉| 天天射影院| 五月激情站| aaaaaa片| 手机在线日韩视频中文字幕| 成人免费黄色短视频| 国产婷婷综合| 欧美婷婷五月天综合| 色色色地址| 激情内射人妻1区2区3区| 丁香五月婷婷在线| 五月婷婷,六月激情| 另类视屏| 在线观看日韩12345区| 9精品在线| 婷婷六月开心网| 超碰永久在线| 激情久久久久久| 五月婷婷插一插| www99在线观看视频| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 久久最新色| 国产毛片精品一区二区色欲黄A片| 久热视频这里只有精品| 99热这里只有精品10| 婷婷激情五月视频| 91碰免费视频| 极品人妻VIDEOSSS人妻| 色婷婷视频| 色久五月天| 久久er+| 五月天婷婷香蕉狠狠超碰综合| 熟妇人妻中文字幕无码老熟妇| 99精品一二三四视频| 亚洲99手机免费看视频| 亚洲激情免费久久| 中文字幕综合网| 国产看真人毛片爱做A片| 天天综合中文| 夜夜爽天操| 天天舔天天摸天天射| CAOBIBI| 五月婷婷色色爱| 婷婷综合五月天| 天天干天天操天天射| 久婷婷久草| 欧美激情综合| 激情黄色小说色五月| 十二区无码| 丰满人妻一区二区三区| 思思热在线观看| 色婷另类| 香蕉人在线香蕉人在线 | 精品色色网| 九九av| 九九99热久久精品66中文字幕| 综合色在线| 婷婷色色五月| www久| 婷婷五月天国产在线播放| 深爱女色婷婷丁香五月亚洲图区| 亚洲sesesese| 大香蕉久久| 99视频在线播放大全| 国产高潮白浆一区二区| 五月天激情综合| 久久怡红院| 婷婷色爱| www.伊人天堂偷偷婷婷| 人妻久热| 五月丁香无码| 色五月婷婷基地| 亚洲天堂九九九| 性做久久久久久久免费看| 婷婷天天色| 爱操人妻| 九九色综合九九色| 丁香五月激情婷婷婷婷在线观看| 深夜激情网| 婷婷六月激情在线视频| 色婷婷社区| 天天摸人人摸| 99色精品| 久久色五月| 五月天婷婷伊人| 97色女人在线| 超碰久热| 亚洲成人免费在线| 99热这里只有精品最新| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 亚洲色五月婷婷| 日韩二区搞逼插逼毛片| 亚洲操女| 婷婷色色欧美| 亚洲综合草草| 五月丁香久久精品在线观看| 亚洲综合色网站| 热的国产,热的综合,热的有码| 亚洲精品乱码久久久久久综合| 激情五月天啪啪视频| 五月婷婷在线视频免费观看| jiujiu无码五区| 婷婷爱综合| 思思色综合网站| 五月天自拍视频| 狠狠狠狠狠操| 婷婷五月情| 色婷婷丁香香香蕉视频| 丁香婷婷九月| AVDV久久| 亚洲天堂婷婷| www91在线| 日本99在线视频| 伊人婷婷综合| 五月婷高清视频| 开心五月色婷| 婷婷五月激情六月| 午夜成人综合| 在线99热| 五月亭亭开心网| 大香蕉啪啪啪| 色五月婷婷丁香凹凸| 色吊丝av中文字幕| 丁香六月婷婷综合欧美| 成人精品一区二区三区四区五区| 天天草天天日| 色爱综合网| 久久一热| yjzz亚洲国产| 丁香六月婷婷色XXXXX| 男人的天堂99| 久久98| 久久婷婷五月国产色综合激情| 思思视频这里是精品| 色婷婷六月精品| 激情六月五月婷婷综合网| 中文字幕丁香五月| 五月婷婷精品视频| 超级碰碰碰97免费| 亚洲精品婷婷| 在线色婷婷| 日韩精品一区二区亚洲AV观看| 天天久久66xxx| 激情综合综合综合| 亚洲va欧美va天堂v国产综合| www.91九色| 丰满少妇猛烈A片免费看观看| 激情婷婷五月在线合集| 91精品无码| 五月天小说激情| site:pnnrt.com| 影音先锋一区二区三区| 伊人在线另类| 久久久久激情网| 天天日天天狠狠操| 人人人人人人人草| 激情五月久久| 五月天婷婷Av| 超碰免费人妻| 久久人妻人人槡| 婷婷 色 丁香 夜| 激情五月丁香色婷婷| 五月网网站| 婷婷激情六月综合| 欧美日韩成人综合9| 日本婷久久| 五月婷婷久久爱| 婷婷色在线视频| 色综合五月| 日笨久久网| 六月婷婷六月天天在线免费| 色激情五月天| 久久婷婷五月天大香蕉| 亚洲性受XXXX五月丁香| 婷婷五月天成人网| 丁香五月天AV在线 | 色五月婷婷久久| 丁香六月色情| 婷婷成人AV| 4438亚洲欧美| 亚洲网站在线鸭子av| 亚洲热久久| 日韩成人免费电影| 亚洲婷婷丁香| 婷婷激情小说| 九九婷| 丁香五月天无码AV| 天天插天天爱| 亚洲日韩一页精品发布| 久久99网站| 五月丁香色| 99re在线播放| 操操碰| 5月丁香婷婷激情网| 国产日韩精品SUV| 狠狠人妻色综合| 久久A区B区| 色综合色| 五月总合激情网| 99热这里都是精品| 日本99婷婷| 五月丁香激情综合六月涩涩爱| 婷婷五月天久久久| 激情九月天天天天婷婷| 狠狠草狠狠草| 婷婷丁香大香蕉| 婷婷丁香五月天欧美| 久久性爱视频| 丁香五月婷婷亚洲综合精品| 六月丁AV| 国产XXXX搡XXXXX搡麻豆| 久9久9久9久9久9久9| 久久色五月天激情小说| www.韩日视频| 天天日日夜夜爽。| 天久综合91综合首页| 亚洲婷婷五月天综合| 97操视频| 丁香五月婷婷黑人妻黄色电影院| 激情五月影院| 色99免费视频中文| 五月天色影院| 欧美日韩中国| 激情五月久久| 丁香五月婷婷亚洲另类| 亚洲精品永久久久久久| 激情av网| 99综合| www久久久久久久久久久| 99热这是里只有精品| 日日色综合| 中文无码婷婷| 国产 码在线成人网站| 99热网址| 亚洲综合视频在线| 国产99久久久| 99精品无码| 26uuu国自产精品| 久久久网站| 粉嫩av懂色av蜜臀av熟妇| 午夜爱爱网站| 九九五月天| 五月天开心色情网| 啪啪色激情五月天| 亚洲亚洲人成综合网络| 五月天四色房丁香| 任你干aa| 六月婷婷色综合| 婷婷九色| 日韩999| 丁香六月婷婷| 国产日韩欧美| 婷婷激情网五月天| 中文字幕天天干| 久久久噜噜噜久久人妻| 激情婷婷综合网| 欧美婷| 日本三级第一页| 久久视频在线| 六月丁香婷婷色狠狠久久| 在线综合网| 欧美 日韩 成人| 五月丁香影视| 激情视频网址| 亚洲另类在线观看| 日韩AV色色色| www.综合久久| 久综合网| 五月丁香婷婷激情久久| 曰本aaaaaa丈片| 日本狠狠色| 色婷婷免费观看| 人妻啪啪啪| 五月婷婷久久综合| 欧美日韩精品一区二区三区钱| 婷婷激情五月色综合| 99热免| 狠狠色五月激情| 中文字幕丰满孑伦无码专区| 99精在线| 婷婷综合网| 拍真实国产伦偷精品| 丁香五月天婷婷久久| 婷婷五月丁香青青草在线| 欧洲第一久色| 五月丁香啪啪啪综合网| 蜜桃五月天| 午夜丁香五月天综合| 久久99精品日本| 99re8在这里只有精品| 激情美女五月天| 中文字幕 中文字幕明步| 亚洲va欧美| 99久久99综合| 婷婷五月AV| 五月久久噜噜| 性爱七区| 婷婷久久久| 丁香五月婷婷手机| 99啪啪视频| 久久这里都是精品| 丁香六月婷婷激情综合| 婷婷天堂综合网| 国产成人在线精品| 插插五月天| 色色综合激情| 国产精产国品一二三在观看| 婷婷婷婷婷婷婷五月丁香| 久色网址| 婷婷五月天av小说| 婷婷午夜天| 婷婷色色综合激情| 另类图片五月天婷婷| 婷婷五月天av| 五月天狠狠草| 9九热视频| 色婷小说| 婷婷色五月激情| 婷婷色网站| 久99热在线观看| 另类视频在线| 丁香五月婷综合网| 狠狠色狠狠干| 九九热在线99| 丁香五月亚洲综合丝袜| 国产亚洲色婷婷久久99精品91| 日本熟女视频一区二区| 色色影院黄大片| 91Chinese在线| 久久久久er热| www.激情| 青青草Avb在线| 欧美槡BBBB槡BBB少妇| 五月天色婷婷伊人网| 91婷婷丁香五月| 综合福利网| av网址在线| 国产精品五月天婷婷| 九九热这里只有精品556| 自拍视频99| 亚洲亚洲人成综合网络| 伊人久久五月天| 色久五月天| 激情婷婷色小说| 精品99在线看| 欧美偷偷操| 丁香六月综合激情| 三级三久久线久久99久目本WW| 六月丁香婷婷天堂| 五月天婷婷激情网| 亚洲精品视频电影| 色婷婷人人| 国产精品涩涩涩视频网站| 九九色影院| 五月天婷婷在线AN| 26uuu亚洲欧美| 婷婷久久午夜网| 99久扒热| 久久99激情五月天| 日本女色人人| 成人片黄网站色大片免费毛片| 久九色| 丁香五月天亚洲视频| A色色| 九九色影院| 五月亭大香蕉| 亚洲无码AV片| 51精品国内探花| 爱久久小说下载网| 大地9中文在线观看免费高清| 99久热| 色色性爱视频| 天天狠狠干| 极品人妻videosss人妻| 777久久综合视频 | 人人草人人视| 婷婷五月六月激情| 婷婷五月综合在线视频| 婷婷五月天xxx| 久操b网| 99黄色性生活| 玖玖综合色| 人妻激情在线| 9l视频自拍九色9l黑人| 欧美欧盟性爱网| 成人中文网| 婷婷五月天av| av在线资源| 97人碰人操| 大香AV| 婷婷六月天国产综合| 狠狠狠狠狠干| 99热丁香| 亚州操操| 夜夜谢天天干| 狠狠色婷婷777| 五月婷婷干| 精品99网站| 第六色在线| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 99WWW免费视频| 啪啪东京热| 国产99久9在线| 亚洲免费av观看| 色婷婷在线影院| 激情网色五月| 97碰免费精采视频| aa久久| 大香蕉久热| 国产成人高清| 九九热在线观看6| 人妻久久久久久久久妻久久久久久久久 | 色综合五月天| 成人丁香五月| 国产欧美性成人精品午夜| 天天干天天干天天干| 99性爱视频| 国产FREESEXVIDEOS性中国 | 久久久精品AV| 五月婷婷五月| 少妇人妻人伦A片| 日本精品久久久久中文字幕| 婷婷色婷婷| 电影91久久久| 九九中文字幕九| 日韩精品一区二区亚洲AV观看| 婷婷97碰碰| 夜夜资源站| 掩去也综合五月视频| peg 2区三区四区的| 激情丁香五月激情婷婷| 狠狠色婷婷777| 久久视频婷婷| 五月天激情婷婷| 三十熟女| 婷婷五月丁香综合桃花色网| 婷婷激情视频| 五月天六月丁香| 操操操操操电影网| 可以免费观看的AV| 久久五月天婷婷| 婷婷五月综合亚洲| 97人人射| 五月天操逼激情| 9超碰在线| 久热无码| 在线五月色播| 在线综合网| 精品久久99| 免费观看全黄做爰的视频| 色婷婷人人| 99热在线精品播放| 欧美精产国品一二三区| 婷婷五月情色| 日本色爽| 久久五月视频| 久久婷婷桃花五月天| 啪啪五月综合| 丁香五月婷婷亚洲色图| 五月天色官网| 开心婷婷中文字幕| 成人精品在线观看| 九月丁香网婷婷| 97热这里精品在线视频| 伊人久久婷婷五月天激情四射| 停停五月丁香| 五月天婷婷影院| 婷婷国产五月天17c| 亚洲中文字幕av| 开心五月婷婷在线视频免费观看| 免费观看欧美成人AA片爱我多深| 99在线精品免费视频| 五月天福利影院导航| 六月婷婷啪啪| 大香蕉院线| 92久久| 九久久九精品视频| 婷婷久久综合久| 久久性爱视频久久性爱视频| 天天天天天天操| 日本A片一区| 丁香五月1页| 亚洲性色XXXXX| 另类在线| 99热久久日本| 丁香花五月天| 久久九九网| 热久久这里只有三级视频| 99热免费精品| 巴基斯坦粉嫩无码视频| 99激情| 91天堂网综合| 五月丁香婷中文字幕| 欧美色图天堂网| 五月天激情黄色网址| 一夜福利不卡| 丁香五月成人婷婷| 激情综合网激情五月婷婷| 久久激情综合| 精品久久这里热66| 在线视频区| 99热免费网站| 人人摸人人| 狠狠婷婷色综合| 99精品国产在热久久| 人妻自慰高清合集| 久青草影院| 九九热视频99| 丁香五月天电影| 久久五月婷天天干| 超碰免费成人| 天天天干夜夜夜操| 久草免费福利视频| 五月婷婷co.m| 五月色丁香| 99欧州偷拍视频| 日韩精品无码99| 99热久久这里只有精品| 色婷婷九月| 久久婷婷丁香| 久久99免费视频| 五月天开心激情网色欲无码| 91人人操人人| 99热精品超碰| 丁香五月狠狠综合欧美| 五月婷婷基地| 国产视频福利| 五月花激情| 无码AV久久久久久久久| 丁香 婷婷 激情 综合 五月| 亚欧州精品视频| www久久久久久久| 深爱激情五月天色婷婷| 欧美在线干| 九九色播五月丁香| 亚洲美女网Va| 成人片在线免费看| 欧美成人无码高清一区二区三区| 性生活视频98791| 99热全是精品| 99只有这里有精品在线视频| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 伊人在线婷婷草| 亚洲va综合va国产va中文| 天天射夜夜爽| 欧美成人va| 色999五月色| 色欲婷婷五月天| 激情综合五| 久久久精品AV| 伊人网大香| 五月色婷婷AV| 色五月婷婷久久| 婷婷五月天直播| 国产这里只有精品| 久久五月人人摸| 九九色色| caopeng97日韩| 搡BBBB搡BBB搡五十| 色欲丁香久久| 亚洲AV在线免费看| 五月婷婷激情综合视频| 综合久久8| 99爱免费视频| 九九热视频精品999| 久热播这里只有精品| 国产精品 的国产| 天天久| 人妻激情视频| 成人五月丁香社区| 日韩在线9| 丁香五月天激情| 色欲人妻综合aaaaaaaa网| 日韩无码专区| 99久久综合网| 99热最新国内| 五月天激情国产综合婷婷| 五月激情婷婷国产精品久久久久久| 五月婷婷丁香| 97干97色| 婷婷香五月天| 玖玖资源网站最新站| Www.sesese丁香| 日婷婷久久开心| 九九热10| 美日韩成人| 99热日韩这里只有精品| 国产熟妇乱子伦hd| 色狠狠综合入口| 婷婷99狠狠躁天天躁中文| 亚洲黄色精品| 五月丁香六月婷婷精品| 日日躁夜夜躁狠狠久久AV| 狠狠干在线视频| 色婷婷在线电影| 日本熟妇人妻在线| 999九九九久久久99HD| 1024操逼视频| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 久久婷婷色| 色情·com| 久久视频这里有精品99| 亚洲十月婷婷综合| 亚洲精品网址| 99re8这里只有精品99re8热视频| 五月综合激情图片 | 人人爱摸视频| 五月婷精品| 91久热| 6080av| 九九性爱网| 五月婷婷在线视频| 亚洲色综合性| 思思热久久艹| 成人在线二区| 五月天.com| 玖玖热99| 播播网色播播| 色综合色婷婷色伊人| 天天日日| 99色婷婷视频| 色五月在线| 六月婷婷青青青视频| 欧美丁香婷婷五月| 性生活久久朋友人妻| 99熟女啪啪视频| 精品一二三区久久AAA片| 思思热视频在线观看| 欧美激情丁香五月| 97男人天堂| 深爱激情综合网| 色色免费网战视频| 亚洲高清在线| 日韩有码一区| 日韩黄黄| 26uuuuuuuu国产| 丁香大香蕉| 久久久91精品| 日韩av在线免费观看| www.sd-xiangsu.cpm| 婷婷色色欧美| 少妇高潮呻吟A片免费看软件| 色色色综合| 色婷婷色五月丁香| aa久久| 九八Av| 五月丁香激情综合久久| 人妻久久久久| 天天干在线播放| 九九Av| 色五月成人在线| 五月婷婷综合激情网| 一级片操逼视频| 97热视频| 夜夜干 夜夜操| 99热精品在线播放观看| 丁香影院五月综合| www.yw尤物| 国内外色色色色色成人视频| 欧美激情丁香五月天久久婷婷一区| 久久99看免费| 五月婷三级片| 天天干天天干天天干| 丁香六月综合激情| 丁香婷婷五月天色播| 精品综合爱| 国产日产亚系列精品版优势| 色婷婷成人| 五月婷婷六月丁香在线| 婷婷五月天视| 99人人干| 九九大香视频| 日本久久爱| 五月丁香色色综合| 另类伊人婷婷| 野外99热| 九九在线视频| 婷婷五月激情视频在线| 婷婷激情五月天色| www.婷婷五月天,com| 久久人人九| 日韩有码一区| 丁香五月婷婷激情四射深爱激情| 色色国产| 色色色五月婷婷| 九九视频这里只有精品| 日批在线看| 77799热| 在线观看av网站| 黄色av网站在线免费播放| 成人视频网| 五月丁香六月欧美综合网站| 中文字幕人妻在线| www天天干| 综合婷婷久久| 啪啪黄页网| 97婷婷五月激情六月丁香伊人| 国产精品18久久久| 丁香五月综合婷婷| 久久色五月天| 亚洲激情网| 五月丁香六月激情欧美综合| 久久成人综合五月天| 热热久久精品视频| 亚洲五月丁香综合网| 久久久中文| 九九久久五月天| 久久狠狠干| 色婷婷五月成人网| 亚州色综合| 久草嫩草在线观看| 亚洲成人丁香花| 99热传媒| 黄色激情网站在线观看| 日韩乱轮AV| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | www.cao.com久久| 久久色大香蕉| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 久久99精品久久久久久三级| 国产成人亚洲综合亚洲| www.色情五月天.com| 久草x色在线观看99| www,婷婷,com| 强辱丰满人妻HD中文字幕| 99色在线视频| 99在线热| 九九碰九九爱97超| 人妻22p| av在线激情| 亚洲另类婷婷综合| 99狠狠| 棕合影院色色| www.99久| 99色精品| 超碰久热| 亚洲亚洲人成综合网络| 婷婷久综合| 激情电影五月婷婷| 丁香五月天日韩无码| 熟女国产在线一区二区三区四区| 国产中文字幕在线视频免费观看| 伊人五月婷婷国产视频| 先锋资源91| 二色AV| 天天日夜夜B久久| 五月综合久久| 天天拍夜夜爽日日| 开心五月婷婷99| 五月丁花六月丁香综合| 婷婷成人视频| 综合色五月天| 五月激情综合网| 五月天婷婷在线播放| 99热婷婷| 69凹凸成人综合网| 激情五月九九九| 男人的天堂97| 另类视屏| 久久亚洲婷婷| 午夜九九电影| 99热这里只有精品免费观看| 这里只有精品免费 | 日本三级日本三级99| 午夜少妇在线观看视频| 久久综合五月天激情小说网站| 艹B高清无码| 婷婷丁香五月在线观看91| 婷婷丁香五月激情密臀av| 色综合色五月| 婷婷亚洲激情在线观看视频 | 婷婷色操| 啊v视频在线观看| 97在线视频观看| 91操黄| 色激情五月| 超碰超碰在线| 中文不卡一二三区| 婷婷开心五月| 五月激情啪啪啪| 人妻丰满精品一区二区A片| 亚洲99一级无嗎特制在线| 天天日夜夜欢| 婷婷丁香69精华| 99这里只有精彩视频| 991国产精选视频在线播放下载| 91爱操| 无码激情AAAAA片-区区| www.99久久久久99| 狠狠色婷婷7777久| 午夜理论片最新午夜理论剧| 五月婷婷亞洲中文| 天天综合网91| 97丨九色丨国产丨PORNY| CAOBIBI| 日韩色色网| 亚洲最大五月天成人网| 丁香五月婷婷激情网| 日韩一区二区A片免费观看 | 久操无码| 天天肏在线| 欧美情色一区| 人碰91| 天天做综合| 夜夜躁爽日| 婷婷五月天网| 久久蜜臀婷婷| 这里只有精品视频视频在线观看| 女力报到正好爱上你| 91一起操| 狠狠色婷| 97久久久免费福利网址| 亚洲激情 久久| 久久综合五月天| EEUSS鲁片一区二区三区| 日韩视频女神99| 九热在线这里有精品6| 丁香五月六月婷婷殴美综合| 丁香五月婷婷AV在线| 99这里有精品| 六月色激情| 五月婷综合性中心| 久久久激情视频| 日比视频91| 久久欧洲久久| 婷婷五月天国产在线播放| 高清一区二区三区日本久| 久久婷婷五月综合啪| 色综合久久久久| 99热在线观看精品免费| 日日夜夜天天| 99操不停| 99热这里有精品6| 婷婷少妇激情| 欧美,日韩成人在线| 乱码操操| 色婷婷六月丁香综合欲精品| 五月天婷婷在线视频| 日本欧特黄色刺激一区影视久精品无码| 亚洲色婷婷色| 久久总和99| 亚洲丁香五冃97色| 97色色色色色色色| 亚洲综合另类| 国产又爽又猛又粗的视频A片| 久草视频一,二三四| 日操| 亚洲成人网在线观看| 东北熟女高潮99综合99| 插插干干干色| 婷婷大香蕉| 91操屁股| dingxiangtingtingliuyue| 狠狠色婷婷| 亚洲午夜av| 天天日天天插| WWW色色色COM| 色国产五月| 婷婷大香蕉| 亚洲成人在线综合| 丁香成人视频| 亚洲中文av| 亚洲狠狠色丁香婷婷综合久久| 婷婷综合| 亚洲中文字幕av| 国产人人操| 99精品在线下载| 俺也去色| 亚洲思思热久| 色情五月综合婷婷| 精品9l九九九九九77777| www.五月激情红色| 97精品人人A片免费看| 性色欲情 网站| 婷婷天堂综合| av在线中文| 亚洲天码视频www蛋播视频| 亚洲性爱AV在线| 6月丁香婷婷激情| 久久婷色| www,8050,午夜三级| 久99久视频| 丁香色综合| 人人视频色| 婷婷伊人网| 色五月欧美| 夜夜综合色| 五月天久久婷| 天天成人丁香美女AV| 国精产品一区一区三区免费视频| 日本激情ⅩXX免费视频| 影音先锋噜一噜| 日韩欧美性爱| 综合婷婷五月丁香在线观看| 成人做爰A片免费看网站找不到了 国产露脸150部国语对白 | 亚洲热热视频| 色色婷婷五月天| 99日本精品视频热| 在线中文av| 色综合九九| 久久婷婷激情四射五月天| 丁香六月五月天| 亚洲在线成人| 综合婷婷都市激情| 热996精品在线观看| 狠狠高潮精品亚洲1| 极品九九九九九九| 久狠狠狠| 4399在线观看免费高清黄色视频| 久色网五月| 超碰99热精品在线| 天天爽综合网| 五月Huangsewang| 99热777| 日本三级99人妇网站| 五月丁香婷中文字幕| 丰满老熟妇BBBBB搡BBB| 天天狠狠插| 九九婷婷五月天| 色色欧美色色| 99色在线视频观看| 噜噜在线| 五月婷婷影| 91精品婷婷国产综合久久| www99热| 91丨九色丨国产打屁股| 天天综合网、天天综合色| 国产亚洲色婷婷久久99精品91| 五月视频日本免费观看| 中文字幕丰满孑伦无码专区| 青青福利网| 日美三级| 99热精品观看| 婷婷中文字幕| 久9视频| 久1色色| 五月天婷婷丁香花| 精品亚洲国产成AV人片传媒| 丁香五月婷婷骚视屏| 欧美三级视频下载| 亚洲最大视频| 婷婷六月激情| 五月丁香激情综合| 激情深爱综合| 色色五月婷婷网| 天天爽天天草| 激情图片99| 久草视频一,二三四| 久久久久久天天日天天爱| 五月婷婷丁香91| 丁香五月天堂| 日韩啪啪网| 99精品视频在线观看| 99热这里只有精品98| 婷婷色五月综合| 婷婷五月色天| 亚洲思思热久| 久草婷婷网 | 亚洲精品乱码久久久久久按摩观| 爱久久小说下载网| 色婷久| 综合激情在线| 色五月激情婷婷| 丁香五月婷婷88在线| 香蕉曰比| 色婷婷综合亚洲| 大香线蕉伊人| 日日干天天爽| 天天爽夜夜爽| 九月色婷婷综合| 五月丁香六月激情| 丁香五月婷婷在线视频| 九九热re99re6在线精品| 久久久久9999| 天堂草在线看www| 丁香久久综合| 久久久国产精品黄毛片| 九九热视频免费的| 九月婷婷色色| 国产精品久久久久久妇女6080| 思思热精品在线视频| a九九热www| 久久精品99国产精品日本| 婷婷成年人免费视频| 五月丁香六月久久| 婷婷丁香五月在线观看91| 91超碰在线观看| 婷婷五月综合在线视频| 极品另类| 国产精品天天狠天天看| 欧洲色| 一个色的综合| 久久婷婷五月天激情| 国产美女无遮挡裸体毛片A片| 婷婷五月欧美综合| 综合av在线| 91欧美日韩综合| 日日懆天天懆| 六月色色| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 人妻内射视频| 亚洲AV色婷婷人禽五月天| 另类伊人婷婷| 五月天久久婷| 操人无码| 九九热99热| 丁香六月开心| 色色色天堂网| 91久久婷婷| 婷婷五月天激情诱惑| 99色精品视频| 色九月国产| 国产真实乱了老女人视频| 精品丁香五月天在线播放| 欧洲激情网站| av免费在线网站| 国产成人综合亚洲| 婷婷五月天堂| 五月婷婷色男女| 丁香五月综合激情久久潮喷| 丁香六月激情综合| 99这里只有精品| 99精品在线| 激情久久 婷婷| 九九亚洲天堂| 五月婷婷婷婷| 亚洲色热| 婷婷色五月天第7色| 亚洲五月天婷婷| 亚洲成AV人片在线观看| 九九久久综合| www.色五月.com| 久久色情| 久草x色在线观看99| 色婷婷影院| 一级二级色大片| 五月婷婷激情四月| 婷婷丁香六月影视| 亚洲狠狠色丁香婷婷综合久久| 婷婷丁香18| 五月六月婷| 婷婷五月天偷拍| 色色综合色视频| 丁香五月大香蕉AV| 色综久久久| 国产婷婷色综合AV蜜臀AV| 亚洲啪啪网| 夜夜操天天干| 天天色综合综合| 五月www| 精品99这里有| 97碰久久| 免费看欧美成人A片无码| 久久婷婷五月综合| 天天操夜夜操| 97 A I色色| 丁香五月在线看| 爱草视频在线| www.激情在线| 九九久久污| 综合一啪| 日本97在线看片| 99在线资源视频| 日日干四虎| 久久伦乱| 97碰人人操| 激情婷婷六月天| 婷婷涩涩五月天| 激情婷婷五月久久| 91久久1118| 97婷婷在线视频| 日本在线视频看se99| 五月婷婷综合天天操| 激情99| www五月| 六月天婷婷| 色999五月色| 久久综合影院| 99这里只有精品| 天天做天天爱天天玩| 青青草五月天| 天天草天天爽| 色欲午夜无码久久久久久张津瑜|