亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

three.js A*尋路實戰(zhàn):從網(wǎng)格降維到角色自動移動 簡介一套面向WebGL與前端開發(fā)者的three.js算法尋路綜合示例結(jié)合Vue框架搭建可交互的3D場景演示A算法與DFS/BFS遍歷在路徑規(guī)劃中的表現(xiàn)適用于游戲開發(fā)、VR/AR項目中的尋路技術(shù)驗證與學(xué)習(xí)。壓縮包共71個文件其中22個PNG、16個SVG、11個JPG主要承擔(dān)紋理素材與界面圖標(biāo)8個JS文件與5個Vue組件負責(zé)三維邏輯和交互界面另有說明文檔、樣式文件等整體大小約3.56MB結(jié)構(gòu)清晰方便直接運行或二次修改。目前已有778人學(xué)習(xí)下載。通過該示例可以掌握three.js構(gòu)建含障礙物的三維場景、Vue管理界面狀態(tài)并讓用戶自由切換算法理解A算法如何結(jié)合啟發(fā)函數(shù)在3D空間中尋找最優(yōu)路徑亦可對照DFS/BFS輸出區(qū)別不同搜索策略的耗時與路徑質(zhì)量適合希望快速上手WebGL尋路實戰(zhàn)并兼顧前端工程化細節(jié)的開發(fā)者。1. three.js 算法尋路示例先讓角色找到路再談走得好不好剛寫完角色移動控制的那個晚上我把速度拉滿想試手感結(jié)果 NPC 一頭撞在墻上推都推不開。前后找了一小時最后發(fā)現(xiàn)是轉(zhuǎn)向邏輯里少判斷了一步。這是做 three.js 算法尋路示例時的常態(tài)模型會跑不會找路。真正能落地的方案不是去調(diào)大量轉(zhuǎn)向邏輯而是把尋路從 3D 空間降維成 2D 問題用規(guī)則網(wǎng)格表示地圖可走性用 A* 求出路徑點再讓角色沿著路徑點移動。接下來按這條路線我給出一份可直接照做的 three.js 實現(xiàn)覆蓋選型、代碼和避坑適合剛把 three.js 基礎(chǔ)跑通、想讓 NPC 或玩家角色自動找路的開發(fā)者。2. 為什么先用 2D 網(wǎng)格尋路three.js 里的算法選型與降維思路2.1 三種地圖表示對比網(wǎng)格搜索、導(dǎo)航網(wǎng)格與路點圖在開始敲代碼前先明確一件事three.js 本身不提供尋路能力它只負責(zé)渲染。尋路要在它外面算好路徑再把路徑數(shù)據(jù)喂給場景里的對象。最常見的三種做法是規(guī)則網(wǎng)格搜索、導(dǎo)航網(wǎng)格和路點圖。網(wǎng)格搜索是把地面切成等大的格子每個格子標(biāo)記可走或不可走然后跑圖搜索算法導(dǎo)航網(wǎng)格是用凸多邊形把可走區(qū)域包裹起來在這些多邊形上做圖搜索路點圖則是手工在場景里放若干個路標(biāo)點連成圖再搜索。三種方式的選擇直接決定后面開發(fā)量參考對比如下對比維度網(wǎng)格搜索導(dǎo)航網(wǎng)格路點圖three.js 落地難度最低網(wǎng)格可直接對應(yīng)數(shù)組中等需要生成和烘焙最低路徑質(zhì)量折線需要平滑貼合地形平滑度高取決于路點密度動態(tài)障礙處理需要更新網(wǎng)格數(shù)據(jù)需要更新導(dǎo)航網(wǎng)格難以動態(tài)處理適用場景中小型固定地圖大型復(fù)雜地形簡單原型演示如果你的項目是中小場景、障礙物數(shù)量可控我建議先用網(wǎng)格搜索把主流程跑通。這是多數(shù) three.js 尋路項目的起步方案也是本文后面代碼采用的方式。導(dǎo)航網(wǎng)格質(zhì)量更高但它引入的生成工具鏈、離線烘焙和動態(tài)維護復(fù)雜度對初版來說負擔(dān)不小。把網(wǎng)格搜索做好以后換導(dǎo)航網(wǎng)格也容易因為 A* 搜索邏輯可以復(fù)用。網(wǎng)上討論時很多人把「導(dǎo)航網(wǎng)格」和「尋路算法」混為一談其實它們是兩件事導(dǎo)航網(wǎng)格是地圖的數(shù)據(jù)結(jié)構(gòu)A* 是跑在這個圖上的搜索算法。理解這一點再看各種資料會順很多。2.2 降維到 XZ 平面對 three.js 意味著什么three.js 世界坐標(biāo)里 Y 軸朝上地面上的普通尋路只關(guān)心水平方向的移動。把三維坐標(biāo)直接放進 A* 是很吃虧的搜索空間從二維多出一層 Y 方向維度路徑會繞到空中而且計算量成倍增加。所以常規(guī)做法是尋路計算限制在 XZ 平面算完后把網(wǎng)格坐標(biāo)恢復(fù)成 Y0或通過高度采樣得到真實 Y 值的世界坐標(biāo)。這里有個容易被忽視的細節(jié)場景地形如果是起伏的不能直接把 Y 設(shè)成 0否則角色會走進地面。我一般會在路徑生成后做一次高度采樣// 從地形幾何中采樣 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; }這段代碼把射線從高空垂直向下打取第一個交點作為地面高度。這樣網(wǎng)格尋路只管 XZ最后再把 Y 填上既保留算法效率又適配了起伏地形。多層建筑的做法是拆成多個水平層每層一張獨立的 XZ 網(wǎng)格層間用樓梯或電梯點銜接。新手最常見的翻車是把樓板和樓梯全部丟進一個三維網(wǎng)格里搜出來的路徑又慢又怪我見過某個項目把三維網(wǎng)格邊長調(diào)到 0.1尋路一次要半秒完全無法實時使用。2.3 定參數(shù)再寫代碼網(wǎng)格邊長、鄰域、啟發(fā)式與移動代價這四個參數(shù)決定尋路效率和路徑質(zhì)量建議在寫代碼前就定好。網(wǎng)格邊長單位是 three.js 場景坐標(biāo)。常見初始值是 0.5 或 1。邊長越小路徑越精細但格子數(shù)量按平方增長A* 的開銷也隨之變大。0.25 以下的邊長適合幾十米范圍的小場景超過 100 米的地圖就建議緩存或換導(dǎo)航網(wǎng)格。做示例時 0.5 是平衡點障礙物邊界誤差在可接受范圍內(nèi)10×10 的場景只有 400 個格子A* 跑一次幾乎無感。鄰域4 鄰域只允許上下左右走路徑簡單無斜穿但看起來生硬8 鄰域允許斜向路徑更自然代價是允許對角穿墻后面避坑章節(jié)會補判斷。真實項目里超過 90% 會選 8 鄰域因為角色斜著走更流暢。啟發(fā)函數(shù)4 鄰域選曼哈頓距離8 鄰域選切比雪夫或歐幾里得距離。啟發(fā)必須小于等于真實代價否則尋路會退化成貪心路徑明顯變差。移動代價正交移動為 1斜向為Math.SQRT2約 1.414。不區(qū)分會讓路徑走向發(fā)飄搜索順序也不穩(wěn)定。完成這些參數(shù)設(shè)置后就可以進入代碼了。常見做法是先寫一個純 JavaScript 的 A* 模塊它完全不知道 three.js 存在再寫坐標(biāo)轉(zhuǎn)換層把網(wǎng)格路徑換算成世界坐標(biāo)。兩者分開后算法單元測試好寫網(wǎng)格邏輯出錯能立刻定位。我一般把 A* 放在astar.js把 three.js 初始化和動畫放在主文件這樣數(shù)據(jù)與渲染解耦后面換導(dǎo)航網(wǎng)格也不用重寫核心算法。3. 搭建 three.js 尋路場景從空場景到可走性網(wǎng)格數(shù)據(jù)3.1 初始化場景和軌道控制器調(diào)試視角怎么搭先寫一個最基礎(chǔ)的三維場景固定好一個便于觀察的初始視角。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)格輔助線方便核對格子的實際邊界 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)試時隨時旋轉(zhuǎ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)讓相機位于場景對角線上方透視效果能同時看到 X 和 Z 兩個方向的延伸。GridHelper(20, 40)表示總長 20每邊 40 格。如果后面把網(wǎng)格邊長改成 1輔助線的分割數(shù)也要改成 20否則看不出格子邊界調(diào)試會非常吃力。3.2 生成障礙物與包圍盒把場景對象變成尋路數(shù)據(jù)尋路邏輯其實不關(guān)心渲染它只關(guān)心「哪里能走」。障礙物的 Box3 包圍盒就是最直接的攔路數(shù)據(jù)。// 記錄所有動態(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)試畫出包圍盒確認阻擋范圍 const boxHelper new THREE.BoxHelper(mesh, 0xffaa00); scene.add(boxHelper); return mesh; } // 示例場景三堵墻和一個方塊 createBoxObstacle(-2, -1, 4, 1.5, 0.6); createBoxObstacle(1, 2, 0.6, 1.5, 3); createBoxObstacle(4, 0, 2, 1, 2);邏輯說明BoxHelper會繪制障礙物的包圍盒線框。A* 尋路不需要場景對象只需要每個障礙物在 XZ 平面的投影范圍。我把包圍盒存進userData.bounds生成網(wǎng)格時就不用遍歷場景里所有 Object3D只遍歷這個obstacles數(shù)組即可。參數(shù)說明h / 2是因為BoxGeometry的中心在幾何體中心要讓底部貼地必須把 Y 上移半高。障礙物數(shù)量少時逐個創(chuàng)建完全夠用如果場景里有幾百個障礙建議直接用一個數(shù)組保存包圍盒數(shù)據(jù)跳過 Mesh 創(chuàng)建因為尋路不關(guān)心渲染層這樣能省掉大量 GPU 內(nèi)存占用。3.3 生成二維網(wǎng)格把障礙物投影到可走性數(shù)組現(xiàn)在把場景地圖拆成一個二維數(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();邏輯說明這里取格子中心點判斷它是否落在障礙物包圍盒的水平投影范圍內(nèi)。行號對應(yīng) Z、列號對應(yīng) X是因為setFromObject返回的 Box3 是世界坐標(biāo)。后續(xù)我們把網(wǎng)格坐標(biāo)轉(zhuǎn)回世界坐標(biāo)時必須按同一套約定否則路徑會橫向反轉(zhuǎn)或前后來回錯亂。參數(shù)說明GRID_SIZE是尋路的空間分辨率它必須和障礙物最小厚度匹配。如果墻厚 0.6 而網(wǎng)格邊長是 0.5格子中心可能落在墻外 0.3 的位置導(dǎo)致角色走到墻和障礙之間的夾縫里。安全做法是讓GRID_SIZE小于等于障礙物最小厚度的一半或者判斷時把包圍盒向外擴半格。我在避坑章節(jié)會詳細展開這里先知道有這個隱患就好。4. 在 three.js 里實現(xiàn) A* 并驅(qū)動角色移動4.1 純 JavaScript A* 實現(xiàn)開集合、閉集合與啟發(fā)式A* 模塊不依賴 three.js這樣純算法邏輯可以單獨測試。代碼里我用開集合存待考察節(jié)點用cameFrom記錄前驅(qū)用gScore和fScore做代價評估。// astar.js —— 純算法模塊不依賴 three.js function heuristic(a, b) { // 八鄰域使用切比雪夫距離避免高估真實代價 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é)點線性掃描即可 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; // 障礙不可走 // 八鄰域穿墻檢查斜向移動時拐角兩側(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; // 沒有可達路徑 } 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é)點節(jié)點少時線性掃描完全夠用。cameFrom用 Map 存前驅(qū)鍵是行 * 列數(shù) 列避免把整個對象當(dāng)鍵造成內(nèi)存浪費。八鄰域穿墻檢查是這段代碼里最關(guān)鍵的細節(jié)從(r, c)斜向(r1, c1)時必須確認(r, c1)和(r1, c)都不是墻否則路徑會貼著墻角斜切運行時視覺上非常怪。參數(shù)說明Math.SQRT2是內(nèi)置常量保證斜向移動代價為 1.414啟發(fā)函數(shù)用切比雪夫距離在八鄰域下不會高估真實代價搜索方向也會更偏向目標(biāo)。?? Infinity用于gScore尚未賦值的節(jié)點未探索節(jié)點代價視為無窮大。如果節(jié)點數(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; // 高度默認填 0起伏地形請用 getHeightAt 采樣真實 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起點在-MAP_WIDTH / 2這個偏置必須同時出現(xiàn)在正向和反向兩個函數(shù)里否則路徑會整體偏移半格看起來就像角色總是貼著障礙物邊緣走。參數(shù)說明worldToGrid里的Math.max(0, row)是防止角色點到地圖外時出現(xiàn)負索引。實際項目中如果不做夾取A* 會直接越界然后崩潰這個問題非常隱蔽。gridToWorld的 Y 值默認設(shè)為 0如果你的地圖有起伏這里要調(diào)用 2.2 節(jié)的getHeightAt(x, z)去采樣真實高度。4.3 創(chuàng)建角色并沿路徑移動速度與到達判定有了世界坐標(biāo)路徑還需要一個占位角色和逐幀移動邏輯。// 創(chuàng)建一個占位角色用圓柱體表示 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āng)前目標(biāo)點切換到下一個 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)點的向量。用Math.min(moveSpeed * delta, distance)限制單幀移動量可以避免角色在高速移動時直接越過路徑點來回擺動。lookAt讓角色的正前方朝向目標(biāo)。參數(shù)說明0.05是到達判定半徑。路徑點密集時這個值要調(diào)小否則角色會在拐彎前提前轉(zhuǎn)向速度越快判定值要適當(dāng)調(diào)大否則角色會錯過目標(biāo)點。clock.getDelta()在setAnimationLoop回調(diào)里獲取是 WebXR 和普通動畫循環(huán)都適用的一幀間隔。速度3意味著每秒移動 3 個場景單位在實際項目里一般會換算成玩家配置屬性方便調(diào)參。5. 避坑指南three.js 尋路的 5 個常見問題與排查5.1 網(wǎng)格邊長大于障礙物寬度導(dǎo)致穿?,F(xiàn)象尋路結(jié)果明明繞開了障礙但角色移動時還是卡在墻邊或穿到墻里。原因GRID_SIZE比障礙物厚度還大格子的中心點可能落在障礙物之外但格子的面積同時覆蓋了障礙物邊緣導(dǎo)致路徑貼著墻走。解決把障礙物包圍盒向外擴展半個格再判斷。最簡單的方式是在buildWalkableGrid里讓b.min.x - GRID_SIZE / 2b.max.x GRID_SIZE / 2Z 方向同理。更嚴謹?shù)淖龇ㄊ前呀巧霃揭布舆M擴展量確保角色模型不會和障礙物產(chǎn)生視覺交叉。5.2 八鄰域未做穿墻檢查路徑斜切墻角現(xiàn)象路徑會從一個墻角斜著切過去運行時角色明顯被碰撞擋住但尋路結(jié)果卻一直選這條路。原因八鄰域允許對角移動卻沒有檢查拐角兩側(cè)的三個格子尤其是對角相鄰的兩個格子。斜向移動時路徑從墻角的頂點穿過去了。解決在擴展鄰居時增加穿墻檢測也就是 4.1 節(jié)代碼里的if (grid[current.r][nc] 1 || grid[nr][current.c] 1) continue。缺少這一步任何八鄰域?qū)ぢ范紩霈F(xiàn)「抄近路」問題。這類問題很多人第一天發(fā)現(xiàn)不了等角色一多就開始穿模屬于最容易翻車的隱藏坑。5.3 路徑點過密角色高頻轉(zhuǎn)向像「抽風(fēng)」現(xiàn)象角色移動時每個格點都轉(zhuǎn)一次方向視覺上像小步亂戳轉(zhuǎn)彎不自然。原因A* 在網(wǎng)格上輸出的路徑包含大量相鄰格點每個格點都做了一次轉(zhuǎn)向。格點間距小于角色步長時轉(zhuǎn)向頻率就非常高。解決對路徑做一次「視線剔除」。從當(dāng)前點出發(fā)嘗試直接連線到更遠的路徑點如果直線經(jīng)過的格子全部可走就跳過中間的格點。簡化后路徑點數(shù)通常能減少 60% 以上再配合下一章的曲線平滑移動觀感會干凈很多。判斷直線是否可走可以采樣直線上多個點逐一檢查所在格子的可走性。5.4 動態(tài)障礙刷新走全量幀率突然暴跌現(xiàn)象某個障礙物被移動后整個尋路系統(tǒng)卡頓 1 到 2 秒。原因buildWalkableGrid每次全量重建O(行 × 列) 加上每個格子遍歷障礙物幾千個格子的場景重跑一次就掉幀了。解決不要每次移動都全量重建改為局部更新。靜態(tài)部分提前烘焙進網(wǎng)格動態(tài)障礙只在自身包圍盒覆蓋的格子范圍內(nèi)改寫。如果場景實在很小、格子不超過幾百個全量重建也能接受但GRID_SIZE不要低于 0.25否則格子數(shù)量會突增到上萬個任何手機瀏覽器都會卡。這個坑在 PC 上可能不明顯移動端一測就露餡。5.5 把 Y 軸混進搜索維度的「飛天」繞路現(xiàn)象兩點在同一水平面路徑卻先高后低甚至從半空中繞過去角色移動時像在飛。原因?qū)ぢ肪W(wǎng)格被做成了三維數(shù)組把 Y 也放進搜索空間。three.js 的 Y 軸是高度方向直接搜三維網(wǎng)格會把現(xiàn)實中不可達的區(qū)域也納入候選。解決約定所有尋路都發(fā)生在 XZ 平面。分樓層場景就拆多層每層做一次二維 A*層與層之間用樓梯或電梯點銜接。如果必須支持坡道建議改用導(dǎo)航網(wǎng)格不要硬磕三維網(wǎng)格 A*。這個問題我在 2.2 小節(jié)已經(jīng)提過但實際項目里還是會反復(fù)出現(xiàn)歸根結(jié)底是因為很多人拿到動態(tài)角色高度就順手塞進了尋路入?yún)ⅰ?. 進階技巧路徑平滑與角色朝向讓尋路結(jié)果不呆板6.1 用 CatmullRomCurve3 把折線路徑變成平滑曲線路徑簡化后還是折線段直接讓角色沿折線移動會出現(xiàn)硬轉(zhuǎn)彎。常見做法是用 three.js 內(nèi)置的CatmullRomCurve3做曲線插值const curve new THREE.CatmullRomCurve3(waypoints); const pointsOnCurve curve.getPoints(50); // 采樣 50 個點 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默認穿過每個傳入點同時把拐角拉圓角色沿著pointsOnCurve走就不會出現(xiàn)直角急轉(zhuǎn)。注意曲線可能會把路徑拉向障礙物一側(cè)所以簡化后的 waypoints 周圍要保留至少一個格子的余量或者把轉(zhuǎn)彎點稍微向可走區(qū)域中心偏移。6.2 用四元數(shù)插值替代 lookAt轉(zhuǎn)身更自然當(dāng)角色移動速度較快時直接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 平面歸一化后的方向向量否則角色會低頭或仰頭。模型面部朝向如果默認是 X 軸正方向需要先給模型套一個父級 Object3D 做軸向修正這是 three.js 角色動畫里最常見的玄學(xué)問題我也踩過。6.3 驗證尋路結(jié)果的三個檢查項調(diào)試尋路時我會??慈齻€值路徑總長度、轉(zhuǎn)向次數(shù)、最小障礙物距離。路徑總長度能反映鄰域設(shè)置是否合理轉(zhuǎn)向次數(shù)多說明平滑不足最小障礙物距離用于檢查是否有貼邊現(xiàn)象。把這三個值打印出來對比調(diào)整GRID_SIZE和鄰域比肉眼盯著屏幕猜問題可靠得多。經(jīng)歷過一次「鄰域改成八鄰域后路徑長度降了 30%但出現(xiàn)十幾處貼邊斜切」的事故后我把穿墻檢測、路徑簡化和 slerp 朝向插值固定成了尋路工具的標(biāo)配?;乜催@個 three.js 算法尋路示例初版不要急著追求花哨的動態(tài)避讓先把「網(wǎng)格 → A* → 坐標(biāo)互轉(zhuǎn) → 路徑移動」這條鏈路跑通再逐步加復(fù)雜度。這個方向值不值得投入取決于你的項目里有多少個需要自動尋路的角色角色一多網(wǎng)格那套很快會遇到性能瓶頸到時候自然會把視線轉(zhuǎn)向?qū)Ш骄W(wǎng)格。你在網(wǎng)格方案里踩過的那些坑換導(dǎo)航網(wǎng)格時還會再遇到一遍。我后來養(yǎng)成了每個尋路改動先打印路徑統(tǒng)計的習(xí)慣省掉了大量深夜調(diào)試時間。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
啊啊啊啊啊好大好舒服想要| 99热在线观看| 新怡红院| 神马午夜久久久| 亚洲成av人片色午夜乱码| 97色色网| 国产日韩欧美亚洲精品95| 久久久啊啊啊| 少妇99| 国产女人高潮视频| 日本狂喷奶水在线播放212| 久久精品男人的天堂| 很黄很污的免费网站 | 色婷婷成人综合| 欧美精品自慰系列寂寞少妇 | 亚洲限制级| 麻豆60秒| 国色天香av| aⅴ日韩成人电影av在线免费看av大全| 天天综合91| 色原狠狠天天天| 伊人玖玖网| 色呦呦、国产精品| 欧美国产日韩清纯唯美| 婷婷久月| 久久久久9| 免费公开人人操| 2021国产成人精品久久| 男人的天堂VA| 高潮9999外国| 啊啊啊慢点| 丝袜美腿91| 97久久久久| com 首页 18岁 禁区 女优 免费 精选 同城| 青苹果影院男人的天堂| 国产四虎在线| 99色网| 大色网久久| 97超碰欧美手机在线| 久插不卡| 超碰天天操| 东京热av男人的天堂| 女同亚洲欧美一二三区久久电影| 97午夜剧场日韩| 玖玖婷婷五月天| 99色热| 99热超碰| 91视频观看网站| 啊啊啊啊二区好大| 久久区| 91亚洲影视| 国产又粗又长视频| 成人自拍三级在线观看| 翔田千里AⅤHD无码| 欧美性爱第一页久久| 51久久夜色精品国产麻豆| 中文字幕黄片在线| 操屄不卡视频| 性站| 伊人精品国产| 91精品人妻偷情| 另类图片欧美激情综合| 国产女人和拘做爰视频 | 亚洲AV无码黄色强奸| 两性色网| 成人五月香网在线| 亚洲欧洲色情高清| 熟女91网| 欧亚乱色熟一区二区三四区| 亚洲凸凹超碰成人| 人人摸人人入| 亚洲无码?第一页| 大香蕉九九| 中文字幕av久久爽Av| 超碰97最新人妻| 少妇精品| 强奸乱伦av电影| 人妻久久久久久久久久久久久久久| 国产精品乱人伊人网| 狠狠躁天天躁日日躁| 久久久涩| 亚洲,日韩,欧美,成人播放| 亚州AV无码国产精品| 精品国产乱码久久久久久影片| 人妻 欧美 中文| 久久风骚城市| 综合久久久久久久综合网| 操99| 日韩欧美~中文字| 天堂v无码免费视频| 亚洲成人无码影院| 99热精品国产| 久久久久久久久999| 色翁荡息又大又硬又粗又爽| 97色五月天完| 97亚洲综合在线| 日韩无码操逼片| 国产按摩一区二区三区| 伊人少妇久久久| 免费在线看黄片av| 欧美一级三级| 天美传媒精品久久视频| 九九碰九九爱97超碰| 热久日综合| 亚洲国产精品成人久久蜜臀| 亚洲欧美中文日韩视频中国语| 国产有码一区| 农村女一级毛卡片| 96精品在线| 97在线观看免费| 日本高清免费一本视频在线观看| 国产性感骚丝袜在线| 好涩综合| 亚洲情色电影网| 亚洲少妇综合| 九九Av| 中精品一区二区三区| 成人亚欧免费视频| 国产日韩欧美| 全球成人中文在线| 欧美激情黑人| 免费AV播放| 大屁股熟女一区二区三区| 国产欧美精选激情视频| 97精品中文字幕| 久操网无码在线| 综合激情97| 久久78| 天天淫人人妻日日色| 亚洲图片激情小说| 亚洲人成色9999精品久久| 天天欧美| 躁躁日曰躁2020| 国产精品黑人一区二区三区| 五十路熟女工口 | 夜夜夜久久| 99无码狠狠久久| 天天舔天天| 九九九九精品九九九九| 岛国不卡超碰护士AV在线播放| 淫荡少妇免费| 999久久芭蕾| 极品极品色影院| 美女啊啊啊啊啊啊| 草b在线| 久久国产在线一区二区| 亚洲美女色图| 99热最新网址| 人人爱人人乐人人操| 久久久久9久久久久| 日本乱人伦片中文三区| 97频视在线| 欧美成人一区二区三区在线播放| 青青草久草| 亚洲中文人妻色| 制度丝袜99| 麻豆av一区二区| 一区二区三区 丝袜 高跟 美腿| 精品999999| 97超碰巨乳| 蜜桃视频精品一区二区| 最新中文字幕在线亚洲| 26uuu偷拍亚洲欧洲综合| 亚欧美无遮挡| 99热在线不卡| 香蕉婷婷| 操逼www.| 永久免费观看的毛片的网站| 亚洲色图 图片| 亚洲少妇喷视频看| 色乱二区| a片自拍直播视频| 青女偷拍网| 欧美色66| 99热这里只有精| www.大香| 人妻性爱一区二区| 久草这里只有精品 | 91福利网在线观看| 国产尤物在线三区| 中文字幕精品三级久久久| 九九九午夜| 国内毛片无码一级毛片| 日韩Va亚洲va欧美Ⅴa久久| 欧美日韩狠狠爱| 狠狠躁天天躁日日躁| 大香蕉免| 偷拍 精品 另类 四区| 中文字幕免费看大片| 91人妻人人澡人人爽人人精品| 国产诱惑| 九热超碰| 久久r精品| 超碰69| 国产农村妇女精品1区二区| 国产精品亚洲美女久久久久| 一个人免费HD91视频| 亚洲蜜乳av| 日本一区二区三区午夜观看| 老熟女乱子伦中文字幕一区二区| 日韩人妻有码免费视频| 精品人妻一区二区三区四区石在线| 综合网亚洲1| 欧美韩国你懂得在线 | 91碰超| 热思思免费视频| 好涩综合| 免费观看日本操逼视频| 天天久久| 亚洲丝袜诱惑| 91在线秘 男同| 测评在线观看AV| 啊啊啊好多水| 97久久久| 操婢日韩| 香蕉综合网| 天天拍天天操| 青青青国产| 九九热精品在线| 久久久草成人网站久久久草成人久久久草久久久 | 久久久一区二区三区三州| 校园春色亚洲| 欧美高清18A片| 久久亚洲中文字幕视频| 久久久久久亚洲Av无码| 久久av网| 蜜桃色院一区久久 | 亚洲欧美日韩精品久久久一区二区| 天天色天天干天天爱| 九色精品视频导航1| 性爱免费视频成人| 五月丁香激情综合网| 丁香六月啪啪| 人人操天天爽| 97人人色| 国产老太乱伦一区| 可能人人看人人摸| 五月香婷婷| 午夜精品久久久久久久男人的天堂| 青青草吊丝| 伊蕉97蜜桃97狠狠综合干| 天操天操夜操夜月操月年年操操| 蜜臀久久99精品久久久久久成人小说 | 偷拍精品一区二区三区| 天天躁日日躁成人字幕aⅴ| 亚洲国产精品无码AV在线| 97人人模人人爽人人| 又黑又大又粗| 91女优在线观看 | 久久久久久久久久9| 人人操人人摸人人看人人插| 人妻精品一区二区在线| 91人人爽人人爽| 亚洲老司机123专区| 欧美色吧综合| 人人干人人操人人爱| 亚洲女毛多水多21P| 亚洲国产精品久久久久久久久久| 日韩欧美大力操| 高清在线偷拍自拍视频| 午夜欧美J进J出白浆流出久久久| 狠狠入| 一本精品日本在线视频精品| 91熟女熟妇视频网站| 裸体美女久久久| 91综合中文字幕| 日本熟妇人妻中出视频| 激情人妻另类| 成人午夜高潮av猛片| 久99视频| 97超色| 性爱综合一区二区| 乱日视频| 天美传媒AV在线| 国产超碰人人爽人人做| 久久久专区| 欧美爆乳精品一区二区| 偷拍欧美激情| 91夜色chaopeng| 亚洲97p| www.亚洲成人一区| 久久日本熟女精品一区| 亚洲综合网电影91| 久久亚洲精品成人av| 欧美日韩午夜精品一区二区三区| 可以看的av| 2019亚洲男人天堂| 另类专区在线观看| 国语精品av| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 可以免费看黄片的视频| 日本 成 人 小说 电影 一区二区| 超碰97综合网| 激情五月天社区| 午夜福利1区2区3区| 蜜桃久久综合视频| 狠狠爱夜夜| 中字乱伦AV| 超碰天天去日穴| 精品超碰国产| 九九九九9999| 久久天天躁日日躁狠狠躁| 亚洲高清视频在线免费观看| 亚洲瓯美色图| 免费1级a做爰片观看| 精爱久久| 婷婷丁香九月| 91日韩网站| 婷婷五月天激情网| 激情小说亚洲| 91在线丝袜视频| 成人性爱视频在线看| 九九九九九九视频| 女人高潮抽搐喷水视频网站| 超碰碰97资源站| 五月天激情国产综合婷婷婷| 欧洲特黄毛片免费看欧洲毛片| 精品91摸| 操逼不卡中文字幕| 久9精品| 富二代亚洲精品99| 伊人久久大香线蕉无码| 亚洲深夜福利| 精品无码久久久久| 91久久婷婷| 日韩无限资源| 精品人妻一区二区三区视频| 色综合色欲色综合色综合色综合| 久久久久久久97| 精彩国产视频播放1区2区| 蜜乳AV一区| 97超碰9| 91日日| 国产一级αv免费看片| henhen91| 亚洲色丰满少妇高潮| 丁香五月自拍| 一区=区三区视频| 久久精品国产亚洲AV嘿嘿| 热热色青青草| 亚洲色图加勒比| 国产精品久久伊人| 级做a爱无码性色永久免费| 亚洲熟女少妇免费视频| 国产精品熟女AV中文字幕在线播放| 琪琪精品免费一区二区三区| 色臀AV| 欧美日韩人妻婷婷一区| 国产精品视频电影| 五月婷婷六月丁香| 欧美精品xxxwww| 青青草福利视频| 欧美在线|亚洲| 中文字幕在线观看AV| 少妇高潮对白在线观看| 亚洲乱色熟女一区| 99久久国产精品免费高潮| 天天综合站| 亚洲性猛交| 久久色人体| 大地资源在线观看中文第二页| 岛国爱情动作片在国产AV无码专区亚洲AV漫画 | 人妻 欧美亚洲| 国产农村妇女精品1区二区| 欧美亚洲日韩人妻在线观看| 亚洲aV无码成人在线观看| 欧美A片中文字幕| 97超碰日韩| 欧美96交| 欧美色图91| 天天影视综合色| 好爽免费视频,| 97大色网| 国产女人9999| 亚洲伊人久久精品影院| 欧美亚洲se91| 日本久久综合| 欧美色色人| 情侣操 逼视频99| 欧美精品第四五页中文字幕在线观看| 久久久噜噜噜久久久| 97色婷婷| 怡红院视频在线| 欧美综合骚| 麻豆天美国美国产| 极品粉嫩一区二区| 欧美一二在线| 亚州色国| 久操视频在线| 91性感在线| 熟女人妻一区二区三区免费看 | 多毛小伙内射老太婆| 成人无码在线视频网站| 国产在线激情视频| 把腿张开老子CAO烂你| 九月丁香综合网| 免费的黄片wwwwww| 色婷婷丁香五月| 亚洲图片欧美91N| 美女的肌被草喷水视频| 日韩9999| 蜜臀99久久精品| 成人区人妻精品一| 天天躁日日躁狠狠躁| 一区二区三区免费视频入口| 7777奇米影视久久| 久草免费在线一区二区| 婷婷色一区| 超碰1024久久| 麻豆黄站| 亚洲色图欧美激情| 国产精品久久久久无码A√| AV网站高清无码在线观看| 欧美日本国产日韩激情视频| 丁香五月天堂网| 色第一页| 婷婷10月天青娱乐| 秋霞一集毛片观看| 国产又粗又长又爽又色| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 久久99国产综合精品女同| 亚洲黄日韩无码专区| 69久久久久久久久久久久久| 久久97| 天堂中文资源在线bt| 亚洲天堂,男人| 亚州色国| 尤物av网站免费在线播放| 国产精品嫩草影院免费| 久久天天性久久伊人| 性性久久| 呦呦一区| 亚洲成人免费电影| 97资源免费视频| 九九九九九九九九九国产精品| 天天爽夜夜爽夜夜爽精| 九九色色| 久久超碰av在线| 在线a亚洲视频播放在线| 欧美亚洲中文字幕| 亚洲精品1区| 国产精品96| 乱伦熟女区| 欧美猛交黑寡妇中文字幕| 超碰97综合在线| 一区操逼日比视频| 日韩超碰精品综合| 亚州色综合| 熟女人妇一区二区三区| 91久久伊人婷婷青青草| 日韩一级欧美一级国产一级台湾| 亚洲男人天堂2019| 久热最新在线杭州| 毛片电影一区二区三区| 亚洲国产亚洲天堂| 狠狠色狠狠色狠狠五月| 草久久久| 日本1区2区不卡视频| 亚洲。日韩。欧美| 国产强奸AV在线| 天堂九九九九九九九九九| 一本大道青青| 全球成人中文在线| 欧美亚洲色的图| 天堂中文日本在线观看| 好看的久久不射无码影视影院| 欧美亚洲天堂| 欧美性,色九九| 亚洲最新Av| 啊嗯好大视频在线观看| 亚洲婷婷丁香在线| 亚洲天堂自拍| 国产精品久久99日日| 91美女视频在线| 男人的天堂午夜av| 99日免费视频中文字幕| 国产欧美日韩精品中文| 欧美亚州综合网图片| 一区二区三区激情在线观看| 精品国产乱码久久久久久久久久毛片| 综合一区中亚洲国产成人综合精品| 91少妇通奸网站| av日韩在线观看电影| 玖玖超碰熟| 中日高清无码操逼视频| 在线中文字幕视频| 清清一区二区三区四区不卡视频| 呦呦影院| 99精品丰满人妻无码| 中国亚洲呦女专区| 久久久久久九九九| 亚州色图狠狠干| 国产精品激情久久久久久久| 夜夜无码| 人人爽夜夜操| 精品一区二区综合熟妇| 天天综合91入口| 国产乱码久久| 18禁免费视频| 中文字幕一区二区无码成人| 欧美熟女激情| 无码自拍SM| 日韩兔费看黄片| 五月开心久久AV官网| 色综合网1| 久久精品国产亚洲5555| 亚洲综合校园春色| 操狠狠| 丁香六月激情| 精品久9| 久久久久亚洲一区女同性恋中文字幕| 久久婷婷综合国际产色怕| 97欧美视频| 人妻天天爽| 四月丁香婷婷| 久久这里只精品99re66图| 青娱乐国产剧情av一区| 麻豆区久久久久亚| 国产精品亚洲四五区在线观看| 欧美午夜一区二区三区| 无码高清操逼| 国产日韩怡红院| 欧美在线啊啊啊| 色综合五月天| 久草免费在线一区二区| 不卡中文字幕aⅴ在线| 东京男人天堂| 黄色片G G G| 久久久99久9| 久久精品性| 久思思热视频在线观看| 免费视频一二三区| 四虎精品亚洲| 中文字幕伊人| 97色色国产视频| 后X久久| 日韩无码成人电影| 国产精品香蕉热久久新品| www.99色| 日韩激情无码影院| 尤物网站91| 不卡在线观看视频| 97se亚洲综合自| 久久久久96| 亚洲日韩熟女人妻高清在线| n1038 一二三区| 东京太热久久久| 骚逼高潮久久精品| 国产激情视频在线观看| 国产AV超爽| 2021久久国产综合精品青草| 免费一级特黄特色大片在线观看看| 84YTCOM性无码| 麻豆精品一区二区三区四区免费观看| 欧美78P| 特污精品女优骚货黄色视频在线免费观看| 久久成人东京热人妻| 久久视频,这里只有精品| 91爰爱欧美| 日日黄色三级网站| 久久久久久久国产| 97精品国产精品免费观看| 操亚州| 无码久| 欧美一区二区三区成人性生活| 婷婷五月天无码| 亚欧美综合网。| 国产精品久久久久久9999| 欧美成人国产精品| 夜夜国自区| 成人性交午夜免费片| 玖玖综合网| 青春草莓视频在线观看网址| 小视频国产| 亚洲一级性爱视频免费看| 99热99在线播放激情| Blackedraw视频一区二区| 黄片直播三级黄片两女一男| 亚洲无码99| 青草青青久久久久久国产| 人人操天天爽| 日本免费一区二区不卡| 一区二区三区麻豆| 成年人黄色视频免费| 久操凹凸视频| 精品久久久亚洲AV成人网站| 91大胆欧美| A啊啊在线观看| 97久久精品不卡| 中文字幕免费看大片| 伊人99热| 99xav| 东京热91| 国产精品日韩在线一区| 91干熟女| 九九成人精品| 99少妇| 一级做a爰片性色毛片久久| 嗯啊抽插大香蕉网页| 久久丁香| 最新av在线| 人妻熟女一区二区在线视频| AV天堂国产| 色婷婷导航| 色欲人妻一区二区在线| 97久操| 一级特黄aaa大片在线观看成人一级片在线观看| 亚洲天堂7777| 综合亚洲情色| 中出欧美| 久久这里只精品99re66图| 日韩av熟女一区二区三区成人| 大香蕉92| 久久精品中文字幕观看| 丁香五月天婷婷姐| 美女t无毒不卡不卡| 日韩精品中文字幕人妻| 九九精品热| 狠狠躁日日躁夜夜躁A| 亚洲成a人v欧美综合天堂下载| 亚洲精品亚洲人成在线麻豆| 99re这里只有精品3| 97中文综合| 国产传媒操逼视频| 综合 青草 伊久久 影院 综合| 97美日韩视频| 狠狠激情综合狠狠操中文字幕| 东北老女人的激情视频| 国产免费一区2区3区| 久久久婷| 9精品久久久久| 欧美系列在线一区二区| 日本最新免费韩国1区2区视频播放| 男人的天堂2018| 97在线视频观看| 日日骚av| 婷婷五月天色色| 人人操人人精品影片| 亚洲无吗在线视频| 中文字幕人乱码中文字的预防方法 | 欧美亚洲激情小说| 天美传媒AV在线| 亚洲激情AV| 老熟乱一区二区三区四区| 3p国产色噜噜一区| 中出91视频| 女人高潮大叫一级毛片| 久久久久久人| 婷色五月| 综合久久97| 欧美激情专区| 黑操B| 国产成人欧美精品在线| 美女在线H91| 日本羞羞的视频在线播放| 成人影 天天操 亚洲| 97色97干| 午夜天堂精品久久| 精品人妻1区| 亚洲精品 欧美精品| 免费精品人妻一区二区三| 加勒比伊人综合| 5278欧美一区二区三区| 天堂网亚洲区手机版| 天堂岛av| 国产AAAAAABBBBB| 国产一区二区久久| av一区二区三区 中文| 久久亚洲一区女同性恋中文字幕| 天天日少妇逼AV| 97无码视频在线播放| 色天堂综合| 欧美一区二区亚洲天堂| 中文字幕在线免费观看 | A V少妇特黄三级| 91肉丝| 神马久久69| 亚洲日本韩国在线| 男人亚洲天堂| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日本性爱欧美性爱| 亚洲熟妇白浆无码AV| 天天插天天射| 东京热视频网| 干妹子| 九九天堂| 亚洲国产麻豆一区二区三区| 日日摸日日碰夜夜爽视频| 中文字幕av久久爽Av| 最新中文字幕在线亚洲| 老熟女91视频| 中文字幕AV片| 97久久久久久久精| caoni国产亚洲av| 亚洲天堂男人天堂网| 欧美色一二三| 激情综合五月| 国产精品免费日韩| 97干色| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 日韩激情电影中文字幕| 久久久九| 91久久国产综合精品| 高清无码网址| 强奸乱伦动态污图免费 | 撸无码不卡免费视频| 亚洲精品欧美专业| 丁香五月综合| 国产精品成人蜜臀AV在线| 日韩啊V| 大香蕉狠狠爱| 欧美亚洲韩国视频十五区| 青青草视频在线观看一区二区| 六月婷婷综合| 欧美黄片欧美黄片xxx| 精品日韩人妻视频| 久久精品一区二区| 欧美色图99| 蜜臀无码一区二区| 亚洲视频一二区| 免费的av网| 色性综合| 91操人| 在线观看综合精品亚洲| yellow网站免费观看日韩高清无码| 欧美狠狠| 国产熟妇 码视频户外直播| 99在线观看视频在线高清| 中文字幕文字幕无码一区二区三区电影99| 性色avv| 性欧美另类高清| 色婷婷狠狠| 五月天成人综合| 凹凸视频特色日本特黄| 在线视频日韩欧美国产| 成人免费福利在线观看| 黄片免费久久久久久久| 精品无码久久久久久国产浪潮| 国产成人亚洲精品无码最新在线| 亚洲天天综合| 欧美日本成人一区二区| 超碰91在线| 中欧人妻丝袜中文字幕| 欧美日韩中文视频播放| 2019天天干| 男人天堂网址| 中文字幕在线免费观看2| 欧美日韩在线视频网站| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 爱逼综合| 亚洲麻豆av一区二区| 国产综合色精品在线观看| 偷拍 欧美 日韩| 国产精品麻豆免费视频| av日韩国产一区二区| 精品一区二区人妖| 色色五月婷| 国产视频97| 亚洲日本激情| 亚洲国产婷婷在线播放| 91精品久久综合熟女| **一级毛片国产| 久久久久9999妇女| 中文字幕日本久久| 精品国产肉丝袜在线拍国语| 99热亚洲| 人人摸人人干| 91成人社区| 中文字幕一区二区韩| 四虎影视永久在线免费| 黄aaaaaaaaaaaaaaaaaa色网站| 超碰在线91| 欧美少妇第一页| 欧美亚洲综合999| 成人无码欧美一级A片狼牙直播| 美女诱惑一区| 天天看天天在线精品| 久久婷婷精品| 久久av色| 婷婷人妻激情| 国产中文字幕在线点播| 日韩一级片在线看| 亚洲aw毛茸茸在线| 亚洲亚洲亚洲天堂天堂 | 在线岛国新天堂8| 亚洲啪啪性视频| 婷婷色香| 午夜福利 成人 91| 人妻偷拍一区二区三区| 日韩精品一区二区三区色欲 | 一级一性爱免费视频| 久久毛卡| 欧洲中文字幕| 国产一区二区在线看| 欧美日韩国产成人高清| 黄片在线免费在线观看| 青青草久久一区网| 99re这里只有| 韩国成人精品久久久免费看| 另类综合另类| 亚洲色图 91| 久久精品久久九九精品| 亚州伊人色综台| 97久久国产亚洲精品超碰热| 成人午夜高潮av猛片| 成人精品在线观看| 超碰一区二区| 亚洲熟女精品| 婷婷三区| 91亚洲人| 另类天堂| 精品少妇一区二区| 亚洲强奸乱伦影视网| 成人精品视频一区二区| 亚洲人久久久久日| 成人性爱全视频观看| 国产精品网站www| 91在线视频国产网站| 丁香五月性| 亚洲,欧美,综合网| 九色在线熟女国产黑人| 欧洲亚洲人妻无码中字久久三区四区| 玖玖综合网| 激情五月综合网| 日韩精品三级| 九九色婷婷| 久久久久96| 黄片aaaaa一区| 亚洲无限观看| 国产高清在线观看欧美| 男人天堂综合| 欧美一级久久久丰满| 色爱欲亚洲| 国产精品高清2021在线| 91麻豆天美国产| 熟女激情综合网| 91暧暧| 婷婷五月天网| 72av视频| 婷婷香蕉欧美在线一区二区三区| 欧美色图91| 亚洲欧美校园另类春色| 久久久久久久精| 啊啊啊 在线观看| 欧美91精品国产自产| 久久久一热在线播放| 麻豆精品一区二区三区四区免费观看| 韩国久久97| 久久伊人最新网址视频| 国产夜夜操| 午夜超爽| 激情文学小说一区二区| 九色视频91| 日韩97P| 日韩内射视频| 欧美一区二区三区入口| 久久精品成人一区二区三区蜜臀| 五月丁香社区婷婷日韩欧美精品影院| 国产精品久久久午夜夜伦鲁鲁| 曰韩无码777| 欧美日韩资源| 青女在线| 综合色99| 成年人黄色视频免费| 国产天美传媒精品| av一区二区三区 中文| 欧美人妻少妇| 熟女欧美日韩综合婷婷| 欧美成人一级免费电影| 日韩欧视频| 色婷婷综合久久久久中文一区二区 | 一区二区三区免费岛国片| 极品少妇久久久久| 亚洲人精品久久久喷水| 欧美精品日韩久久久九| a啊啊啊啊啊啊啊啊一区二区| 欧州色图区| 嗯啊视频免费在线观看| 激情综合 婷婷五月 红杏| 成人AV素股で擦久久| 中文字幕精品一区二区精| 国语少妇精| 91丨精品丨国产丨丝袜| 99色在线| 国产人伦a片信息免费片| 鸥美中出| 中亚黄色三级大片| 亚洲18禁| 欧美很很操视频| 人人操,人人插| 日曰骚久久精品| 色婷婷久久综合超碰| 日韩人妻资源在线看| 操迟操逼在巾线Fre看| 97在线免费看视频| 激情小说亚洲视频| 亚洲男人天堂2012| 五月丁香六月激情综合| 男女性感激情网站| 亚洲国产综合视频| rivers-china.com| 秋霞午夜视频一区二区| 极品色社| 五月色网| 激情综合二| 久久欲| 蜜臀久久99精品久久久久久-DVD原版全| 综合一区二区影视| 丝袜天堂| 亚洲人在线成线成人| 狠狠色综合网| 一级性爱aaaa| 秋霞无码av鲁丝片一区| 亚洲欧美日韩制服另类| 精品无吗m| 超碰在线日韩一区| 啊啊啊好疼| 歐美性天天| 91撸色网 玖玖网 欧美| 久久婷婷国产一区二区色| a在线观看| 九九无码视频| 天天日B夜夜干B时时操B| www.yeyecao| 日韩av电影成人在线| 久久久999| 午夜毛片亚洲精品片国产久久久| 97操碰| 自拍啪啪视频| 中文字幕二区| 97草草| 女上位精品在线| 日韩熟女视频二区| 精品中文一区二区| 中国熟女91| 91国产丝袜美女| 久男人久久| 九九这里只有精品| 亚洲性刺激| 九九热精品视频六| 风韵犹存大大大大香蕉 | 色综合九九| 日韩中文字幕二区| 久久综合婷婷| 亚洲不卡AV在线| 夜夜夜久久| 久久蜜桃综合网| 10000部十八禁看电影| 美性中文综合网| 国产精品九九| 高清无码学生妹高潮| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 天天看天天日| 五月天我淫我色av| 国产绿奴视频在线观看| 久久成人午夜精品影院| 精品一区二区人妖| 9色在线| 久久国产99精品72福利| 在线视频一区二区传媒| 亚洲色情在线影视| 欧美色图99| 69一区二区| 亚洲成aⅴ人片不卡无码| 美国人人操人人操| 婷婷亚洲综合| 国产精品九9| 久久久久久久久久久久久久久久9| 亚洲综合大片| 日韩一二三区| 国产黄片精品在线| 极品尤物在线观看| 有码免费观看| 精彩久久中文| 男人天堂欧美| 九月丁香婷婷色| 99热自拍| 蜜臀久久久| 粉嫩av一区二区三区天美传媒 | 日日黄色三级网站| 午夜亚洲| 性暴力欧美猛交在线直播| 国产精品免费美女视频| 欧美精品人妻视频| 加勒比av官网在线| 啊啊啊啊网站| AA特级绝黄| 久久婷婷国产一区二区色| 男人精品天堂一区| 久久久久亚洲| 留下AⅤ黄色片| 日本三级小说中文字幕| 精品无码一区二区三区| 伊人热综合| 99久久久久| 成人在线视频一区| 91爱剪切久久| 色成人Www精品永久观看| 一道本久久棕合爱| 欧美日韩97在线| 久久国产逼| AV中文在线| 亚州欧美总和| 1769国内精品视频| 亚洲第一页色| 91激情国产| 影音先锋新男人| 大香蕉免费中文| 综合情欲网| 丁香六月激情| 国产夜夜操| 蜜臀久久99精品久久久| 亚洲图片偷拍视频区| 欧美成人色| 欧亚无码视频| 无码免费一区二区三区啪啪| 熟女91网| 亚洲系列第一页| 热久久国产精品视频大陆精品| av中亚| 久久久一区二区三区四曲免费听 | 天天日天天色| 在线播放中文字幕| 强奸乱伦Av网| 乱久久久| 国产人伦a片信息免费片| 天天综合欧美综合| 女性喷水高潮在线观看| 欧美性猛交美女自慰91| 东京太热男人的天堂久久久| 国产成人在线观看综合| 嫩草 我啊~嗯~在线| 探花一区二区三| 欧美97日韩| 操人人| 欧美在线55555| 欧美日韩大黄片| 一级黄碟在线观看| CCYY草草影院地址入口| 麻豆AV一区二区| 一起草三级AV电影在线观看| 久久久久无码| 岛国在线国产| 超碰这里只有精品| 日韩国产欧美伦理在线| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 日韩欧美亚洲一区二区三区影院| 精品一国2| 亚洲自拍天堂| 亚洲青青草| 日韩免费看黄片| 国产乱码久久久| 九九热在线精品视频| 青青草好吊色| 人人妻人人操人人乐| 国产午夜精品理论片a大结局| 4141514逼喷水三级片| 夜夜操美女| 久久熟女久| 桃花色涩综合影院| 亚洲欧美情色| 午夜啊啊啊| 啪啪啪精品视频| 中文字幕福利视频一区二区三区在线观看| 超碰免费在线| 香港澳门日本三级网站| 欲射影视| 久久久久国产无av| 国产农村妇女精品| 97日视频| 丁香九月激情啪| 亚洲一区二区在线观看91| 91天堂视频| 91精品无码人妻系列| 一区二区三区高清 | 91快色色色色色| 操熟女91| 亚洲国成人情色好看电影| 2019天天干天天操| 青青草一区二区高清无码视频| 久久大香蕉手机高清| 一起草日韩| 综合网 欧美| 日韩ab网 | 精品国产乱码久久久久久蜜臀| 图色综合网| 日韩乱伦视频| 麻豆三极片| 锕锕好爽 死我在线观看| 一二三区在线| 91足交| TS人妖另类精品视频系列| 九九九热精品| 99r九九| 五月色网| 日韩亚洲中文有码视频| 天久久久噜噜噜久久国产精品爽爽 | 欧美同性恋 的搜索结果 - 91n| 久久久久久久久久久97| 久久肏大逼| 日日操免费视频| 蜜臀99久| 中文字幕色AV| 亚洲激情色片| 亚洲 欧美都市激情| 国产尤物AV尤物在线观看不卡| 超碰78| 久久久亚洲熟妇资源| 天天天天做夜夜夜夜做| 久久国产三区| 色情五月综合婷婷| 美女午夜福利免费视频| 国产 日韩 欧美一区| 激情婷婷黑人91| 91激情综合| 久久久久久91香蕉国产| 欧美日韩夜夜| 九月丁香婷婷| 26uuu国产免费观看| 人人 操人人 操人人| 蜜臀久久99精品久久久久| 日韩无码服务区| 欧美天堂亚洲电影院一区在线播放| 成年男人的天堂| 99少妇精品视频| 人妻AV在线| 91GD.COM| 日韩不卡a级视频专区| 亚洲国产奇米影视久久| 被窝影院午夜看片无码| 啊啊啊在线观看| 亚洲综合九九| 91第一页| 亚洲欧美洲综合| 97视频播放| 蜜桃臀av一区二区| 五月天九九日国产精品一区二区三区| 日本精品久久久久久久| 色色综合97| 日本黄色裸日本黄色裸体| 亚洲五区熟女| 蜜桃在线观看一区二区三区 | 日韩欧美女求操每天更新| 日本不卡中文| 91色夜| 91天天综合日韩欧美| 久久久久久九| 亚洲天堂久久久久久粉红视频| 日本一区二区三区四区五区六区七区八区九区| 一二三区视频在线观看| 日本欧美不卡| 97亚洲在线| 国产精品人妻免费精品| 免费视频在线一区二区不卡| 亚洲春色欧美激情自拍| 亚洲精品国产熟女| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 国产深夜福利| 可以免费观看的AV| 一区二区激情国产熟女|