久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

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組件負(fù)責(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)并兼顧前端工程化細(xì)節(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 本身不提供尋路能力它只負(fù)責(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)維護(hù)復(fù)雜度對初版來說負(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)直接放進(jìn) A* 是很吃虧的搜索空間從二維多出一層 Y 方向維度路徑會繞到空中而且計算量成倍增加。所以常規(guī)做法是尋路計算限制在 XZ 平面算完后把網(wǎng)格坐標(biāo)恢復(fù)成 Y0或通過高度采樣得到真實 Y 值的世界坐標(biāo)。這里有個容易被忽視的細(xì)節(jié)場景地形如果是起伏的不能直接把 Y 設(shè)成 0否則角色會走進(jìn)地面。我一般會在路徑生成后做一次高度采樣// 從地形幾何中采樣 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)格層間用樓梯或電梯點銜接。新手最常見的翻車是把樓板和樓梯全部丟進(jìn)一個三維網(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。邊長越小路徑越精細(xì)但格子數(shù)量按平方增長A* 的開銷也隨之變大。0.25 以下的邊長適合幾十米范圍的小場景超過 100 米的地圖就建議緩存或換導(dǎo)航網(wǎng)格。做示例時 0.5 是平衡點障礙物邊界誤差在可接受范圍內(nèi)10×10 的場景只有 400 個格子A* 跑一次幾乎無感。鄰域4 鄰域只允許上下左右走路徑簡單無斜穿但看起來生硬8 鄰域允許斜向路徑更自然代價是允許對角穿墻后面避坑章節(jié)會補(bǔ)判斷。真實項目里超過 90% 會選 8 鄰域因為角色斜著走更流暢。啟發(fā)函數(shù)4 鄰域選曼哈頓距離8 鄰域選切比雪夫或歐幾里得距離。啟發(fā)必須小于等于真實代價否則尋路會退化成貪心路徑明顯變差。移動代價正交移動為 1斜向為Math.SQRT2約 1.414。不區(qū)分會讓路徑走向發(fā)飄搜索順序也不穩(wěn)定。完成這些參數(shù)設(shè)置后就可以進(jìn)入代碼了。常見做法是先寫一個純 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)讓相機(jī)位于場景對角線上方透視效果能同時看到 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)試畫出包圍盒確認(rèn)阻擋范圍 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 平面的投影范圍。我把包圍盒存進(jìn)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小于等于障礙物最小厚度的一半或者判斷時把包圍盒向外擴(kuò)半格。我在避坑章節(jié)會詳細(xì)展開這里先知道有這個隱患就好。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; // 沒有可達(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é)點節(jié)點少時線性掃描完全夠用。cameFrom用 Map 存前驅(qū)鍵是行 * 列數(shù) 列避免把整個對象當(dāng)鍵造成內(nèi)存浪費。八鄰域穿墻檢查是這段代碼里最關(guān)鍵的細(xì)節(jié)從(r, c)斜向(r1, c1)時必須確認(rèn)(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; // 高度默認(rèn)填 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)負(fù)索引。實際項目中如果不做夾取A* 會直接越界然后崩潰這個問題非常隱蔽。gridToWorld的 Y 值默認(rèn)設(shè)為 0如果你的地圖有起伏這里要調(diào)用 2.2 節(jié)的getHeightAt(x, z)去采樣真實高度。4.3 創(chuàng)建角色并沿路徑移動速度與到達(dá)判定有了世界坐標(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á)到當(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是到達(dá)判定半徑。路徑點密集時這個值要調(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)致路徑貼著墻走。解決把障礙物包圍盒向外擴(kuò)展半個格再判斷。最簡單的方式是在buildWalkableGrid里讓b.min.x - GRID_SIZE / 2b.max.x GRID_SIZE / 2Z 方向同理。更嚴(yán)謹(jǐn)?shù)淖龇ㄊ前呀巧霃揭布舆M(jìn)擴(kuò)展量確保角色模型不會和障礙物產(chǎn)生視覺交叉。5.2 八鄰域未做穿墻檢查路徑斜切墻角現(xiàn)象路徑會從一個墻角斜著切過去運行時角色明顯被碰撞擋住但尋路結(jié)果卻一直選這條路。原因八鄰域允許對角移動卻沒有檢查拐角兩側(cè)的三個格子尤其是對角相鄰的兩個格子。斜向移動時路徑從墻角的頂點穿過去了。解決在擴(kuò)展鄰居時增加穿墻檢測也就是 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ā)嘗試直接連線到更遠(yuǎn)的路徑點如果直線經(jīng)過的格子全部可走就跳過中間的格點。簡化后路徑點數(shù)通常能減少 60% 以上再配合下一章的曲線平滑移動觀感會干凈很多。判斷直線是否可走可以采樣直線上多個點逐一檢查所在格子的可走性。5.4 動態(tài)障礙刷新走全量幀率突然暴跌現(xiàn)象某個障礙物被移動后整個尋路系統(tǒng)卡頓 1 到 2 秒。原因buildWalkableGrid每次全量重建O(行 × 列) 加上每個格子遍歷障礙物幾千個格子的場景重跑一次就掉幀了。解決不要每次移動都全量重建改為局部更新。靜態(tài)部分提前烘焙進(jìn)網(wǎng)格動態(tài)障礙只在自身包圍盒覆蓋的格子范圍內(nèi)改寫。如果場景實在很小、格子不超過幾百個全量重建也能接受但GRID_SIZE不要低于 0.25否則格子數(shù)量會突增到上萬個任何手機(jī)瀏覽器都會卡。這個坑在 PC 上可能不明顯移動端一測就露餡。5.5 把 Y 軸混進(jìn)搜索維度的「飛天」繞路現(xiàn)象兩點在同一水平面路徑卻先高后低甚至從半空中繞過去角色移動時像在飛。原因?qū)ぢ肪W(wǎng)格被做成了三維數(shù)組把 Y 也放進(jìn)搜索空間。three.js 的 Y 軸是高度方向直接搜三維網(wǎng)格會把現(xiàn)實中不可達(dá)的區(qū)域也納入候選。解決約定所有尋路都發(fā)生在 XZ 平面。分樓層場景就拆多層每層做一次二維 A*層與層之間用樓梯或電梯點銜接。如果必須支持坡道建議改用導(dǎo)航網(wǎng)格不要硬磕三維網(wǎng)格 A*。這個問題我在 2.2 小節(jié)已經(jīng)提過但實際項目里還是會反復(fù)出現(xiàn)歸根結(jié)底是因為很多人拿到動態(tài)角色高度就順手塞進(jìn)了尋路入?yún)ⅰ?. 進(jì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默認(rèn)穿過每個傳入點同時把拐角拉圓角色沿著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 平面歸一化后的方向向量否則角色會低頭或仰頭。模型面部朝向如果默認(rèn)是 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
返回資訊列表
久久久一区二区三区三州| 色欧美天天| 十八禁一区二区无码观看| 婷婷综合| 岛国片国产成人亚洲播放| 久久精品一区一起草| 天天舔天天| 欧亚性爱在线视频| PMv在线观看| 91精品国产高清久久久久久,亚洲成人 | 久久精品一区二区一8| 天天操熟妇| 久久一区无码| 精品四五区| 国产女人操逼视频| av在线免费一区二区| 综合夜夜| 外站AV在线| 国产又长又大又粗的视频| 欧美另类色| 五月丁香综合激情| 999国产精品999| 午夜操逼不卡| 久久丁香久草综合网| 一本久久久精品| 性欧美精| 制服丝袜第二页| 91精品人妻一区二区三区蜜桃臀| 国产性刺激| 欧美综合自拍成人自拍第二十页| 六月婷婷五月丁香| 日本高清久久| 按摩中文字幕| 天美国产三级传媒| 丝袜AV一二三区| 色婷婷丁香五月| 亚洲av强奸乱伦| 韩国一级婬片A片AAAAA| 亚洲色欧| 97国产|免费| 日韩天天综合| 亚洲男人天堂手机版| 高清孕妇孕交 交孕妇| 天天澡天天爽日日av| 色诱avtt| 久久宗合亚洲| 91熟女视频网| 一级一性爱免费视频| 91操熟女| 色欲三区| 色官网在线| 床上啊啊啊一区二区三区| 亚洲人妻AV| 91亚洲精品青草| 夜夜肏2021| 亚洲色欲一区二区三区| 欧美一区二区三区黄色影视| 亚洲第一页综合在线| 欧美 亚洲精品首页| 香蕉人欧美综合| 婷婷伊人五月| 欧美精品久久久久久久久88| 欧美亚州手机在线| 日本99一区二区| 成人久久久精品| 麻豆尤物视频网| 激情综合网激情综合| 免费1级a做爰片观看| 久久久久久久国产| 天美av在线| 好属操| 欧美性爱91| 精品久久久亚洲AV成人网站| 懂色AV中文| 国产第11页| 欧美黑人日韩少妇色情| 亚洲中文字幕精品一区| 日韩人成网站在线播放| 美女露胸露屁股| 日韩中文字幕宗合在线| 亚洲美女精品九九视频| 欧美色性爱| 志村玲子视频一区二区| 精品一区99999| 日日躁夜夜躁狠狠躁超爽| 亚洲av综合伊人久久| 逼逼逼逼操操操操操操操操操午夜剧场| 亚洲AV永久无码一区仙野| 亚洲 中文 女同| 日韩不卡一二三四| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 在线免费试看60秒| 91老熟妇| 激情一区二区三区在线观看| 欧美色图91| 成人性爱全视频观看| 欧美少妇人妻| 大香蕉一线视频| 夜夜狼人妻| 青草一区二区| 99青草| 欧成人在线| 久久久国产av美女私房| 99热这里只有精品8| 欧美日韩国产电影| a男人的天堂久久一级A毛片| 精品人妻视频一区二区三区蜜桃视频| 97超碰中文在线| 91干熟女| 好涩综合| 九九热精品在线| 无码人妻系列少妇| 国产成人午夜视频网址| 91 丝袜在线| 丁香婷婷五月| 日本免费不卡二区| 成年无码动漫av片无尽在线| 欧美综合站| 欧美日韩色| 日日干日日| 骚熟女AV网| 国产乱伦一二三区| 精品传媒在线一区| 97中文字幕色| 国产综合网站在线播放 | 99AV| 亚洲一区中文字幕一区| 中文无线日韩一区| 夜夜中出国产| 乱操乱伦AV| 久久婷婷在线观看视频| 中国操逼无码| 91AV天美在线视频| 国产精品成人蜜臀AV在线| 久操网在线| 岛国片国产成人亚洲播放| 欧美91精彩| 岛国免费黄色网址| 涩亚洲欧洲| 大香蕉一线视频| 欧美日韩亚洲少妇寂寞影院正在播放 | 自偷自拍的亚洲视频| 十八禁电影伊人网| 九九久久99| 久 久无码人妻AV| 亚洲国产一区二区三区在线| 国产特级毛片AAAAAA高潮流水| 亚洲视频小说| 国产麻豆一级精品视频| 青青草中文字幕| 国产白嫩精品久久| 国产麻豆福利av在线播放| 一区二区三区四区在线不卡| 熟妇亚洲一区二区三区| 成人三一级一片aaa| 情色五月天网| 欧美色网络| 深夜啪啪啪视频免费| 51国产午夜精品视频| 四季AV一区二区凹凸精品小说| 一级aaaaa欧美中文字幕录像片| 伊人久久亚洲色欲综合网站 | 国产视频人人网| 亚洲综合99999| 静品嫩模一区二区| 香蕉久久AⅤ...| 怡红院亚洲怡春院av| 综合影院亚洲| aaaa少妇高潮大片| 免费少妇一区二区| 九九九九亚洲| 99re6国产精品99re| **一级毛片国产| a片 xxxx受爽视频| 久久久成人精品| 超碰公开久久网| 在线观看亚洲专区| 成人a级高清视频在线观看| 美女丝袜激情小说| 成人综合网 欧美| av凤凰久久久| 中文字幕在线免费观看视频| 亚洲成av人片色午夜乱码| 欧美性爱第1 页| 亚州高清av| 九九久久久久久爱| 伊香蕉综合久久久久久久噜噜噜 | 一本色道无码DVD中文字幕| 国产高清在线自在拍69| 亚洲网污污污污| 男人的天堂啪啪啪啪啪蜜桃不卡| 黄色片大香蕉| 黄片在线免费在线观看| 91精品女厕偷拍视频| 免费精品无码一级毛片牛牛影视| 亚洲深夜福利| 精品视频久久| 亚洲欧美另类小说| 国产精品在线免费| 91亚洲欧美激情| 精品无码产区一区二| 九九久久国产精品| 一区=区三区视频| 婷婷五月丁香五月| 天天做天天爱天天爽| 日韩欧美经典在线观看| AA丁香综合激情| 97最新在线播放视频| 亚洲国产成人福利在线观看| 日韩综合成人免费视频| 无码外流操逼视频| 欧美人人操人人插| 黑人精品XXX一区一二区| 无码国产精品96久久久久孕妇| 亚洲国产日韩精品久久久| 99热精品在线观看| 蜜臀AV一区二区三区| 1024精品在线| 97亚洲中文| 天堂岛av| 久久熟女人| 伊色综合天堂色97| 欧美色色人| 亚州中文字幕超碰97| 美女AV一区二区| 欲射影视| 黄色交缠性感爆操91国产精品免费一区二区三区 | 天天影视亚洲| 日日噜噜夜夜狠狠视频无| 9国产超碰| 成全在线观看免费观看| 国产麻豆福利av在线播放| 国产三级中文有码在线视频| 日本99热| 丝袜视频一区二区在线播放国产中文| 色拍偷亚洲| 亚洲天堂少妇| 男女一进一出视频久久| 久久久久久亚洲中文| 探花熟女,姿勢到位,體驗感也到位| 欧美性巨大╳╳╳╳╳高跟鞋| 日本韩欧美在线播放a| 成人av免费观看| 超碰 另类 欧美 | 欧美色图人妻| Sekablack无码一区| 国产真实野战在线视频| 丁香五月综合| 亚洲 综合 第一页| 9999久久久| 18禁精品网站在线看| 久久精品成人一区二区三区蜜臀 | 国产AV超爽| 97天天爽| 人澡逼| 亚洲,欧美,春色,另类| 美女骚尻视频| 女优视频第10页| 国产精品免费视频人成| 中文高清一区二区的| 欧美婷婷五月天| 探花熟女,姿勢到位,體驗感也到位| 96精品在线| 97欧美| 人妻丝袜无 码视频专区| 91 丝袜在线观看| 精品少妇人妻av久久免费| 99亚洲人人| 欧美成人A天堂片在线观看| 射欧美综合| 啪啪啪精品视频| 99热线麻豆 | 国模91| 秋霞蝌科网日本一区| 色五月激情AV在线| 99热精品在线| 成年人网站在线免费观看| 久久亚洲不卡一区二区三区| 欧美日韩精品一区二区三区高清| 欧洲色综合| 江都AV在线| 蜜乳性色无码专日粉嫩骚逼AV| 熟女熟妇一区二区三区视频| 久久九七| 久久久久久九九九| 日韩国产十八禁| 国产精品久久久吖| v91av| 中文字幕人妻色偷偷久久皮| 欧美97视频| 九九色逼| 欧美人人操人人插| 欧美色图天堂在线| 秋霞一区二区三区四区五区六区七区| 热九九精品| 91操人| 澳门黄片一香蕉视频| 九九九九久久久| 夜夜嗨一区二区三区直播内容| 97操碰| 蜜乳AV免费观看| 欧美72网页| 超97在线精品视频| 男人天堂资源| 综合干干干av久久久综合网| 日韩黄片视频试看| 使劲用力艹少妇视频一区二区| 五十路熟女人妻一区二区在线观看| 99性爱视频| 亚洲精品国产熟女久久久| 性影在线视频| 欧美AB在线| 久久嫩草国产成人一区| 人人 操人人 操人人| 亚洲欧美日韩国产丝袜自拍中文| 久久久国产av美女私房| 久插不卡| 久久只有精品一区二区三区| 久久国产三区| 欧美色五月| 国产亚洲欧美每日在线| 天天综合,91入口| 五月丁香综合啪啪| 久久无码一区二区二三区性色| 91色欧美| 天天欧美| 亚洲 欧美 日韩另类 麻豆| 七久久久| 日韩天美| 91色图片| 中文字幕文字幕无码一区二区三区电影99| 美女人妻色网站| 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | 婷婷人妻激情| 99热导航| 日日黄色三级网站| 99热aaa| 中文字幕精品资源在线| 国产精品视频自拍在线| 人妻-91porn| 亚洲午夜av| 操逼逼一区视频| 亚洲极品| 9久精品视频在线观看| 色综合尤物| 天天干人妇| 欧美视频一| 精品人妻久久久久一区二区三区| 99re在线精品78| 六月丁操逼| 澳门成人网站久国产日韩| 色老汉玖玖爱| 欧美色997| 欧美嗯啊……在线观看视频免费| 久久日本熟女精品一区| 国产青视频| 国产熟女自拍| 日韩欧无码一区二区三区免费不卡| 成人a v在线播放免费| 激情五月天丁香社区| 黑人与人妻| www欧美91| 久久精品日韩| 激情五月天综合网| 久久国99999| 精品999一区二区| 强被迫伦姧在线观看无码网站| 日韩女模中文造逼| 亚洲国产丝袜在线观看| 18禁看网站一区| 午夜高清成人在线视频| 日韩美女,国产传媒,视频一区| 女人天堂AV五区在线| 色香91| 欧美性爱十八禁| 国偷自 一区| 吖在线不卡一区二区国产剧情 | 亚洲无线观看久久| 日日噜噜夜夜久久亚洲一区二区 | 91青青| 亚欧高清在线| 99精品九九九九九九| 欧美日韩国产黄色片| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 国产一区自拍欧美日韩| www.激情| 日夜伊人网| 五月婷婷深深爱| 热久久无毒不卡| 无码聚合| 熟妇色99| 97网址www| 热热色91| 精品无码一二三四区| 一级特黄aaa大片在线观看成人一级片在线观看 | 色姑娘综合网| 国产传媒日本欧美专区| 亚洲欧美日韩精品久久久一区二区 | 看大黄色大片原件| 少妇精品久久久八区九区| 日韩婷婷| 免费视频在线一区二区不卡| 欧美伦乱爱| 搡老人老9丨女老熟人| 精品二区久久| 91天天爱| 亚 欧 美 综合| 性爱视频免费网址| 91第一页| 色97欧美| www.男人的天堂| 91欧美综合在线| 色噜噜人妻av中文字幕| 欧美日韩操逼动图| 一二三区精品视频| 日韩紧密久久| 亚洲国产无码精品首页久久久| 男人天堂网址| 成人精品视频| 国产极品999| 亚洲最大的综合性av| 综合色91| 超碰97国产欧美| 国产乱弄免费在线视频。 | 蜜臀Av一区二区三区| 99热免费| 天天操夜夜操| 婷婷中文网| 99亚洲国产精品色一区二区三区| 品亲网欧美品亲网| 日韩人妻少妇 一区二区三区| 乱伦a片视频| 精品视频一二三中文| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 国产日逼视频| 亚洲色阁| 亚洲综合另类色图| 国产97综合| 中文幕97| 天天影视射综合网| 99re在线视频这里只有精品| 蜜臀av网址| 欧洲小说色图视频另类| 好看的久久不射无码影视影院| 天天综合在线4| 精品网站9999| 啊啊啊快操我视频| 91黑丝美女| 久久日本熟女精品一区| 都市激情人妻一区二区青青操视频| 97色涩| 狠狠爱AV| 欧美精品精品一区二区| 国产精品久久久久久久AV大片| 国产女生在线| 亚洲欧美精品一区天堂久久 | 日韩八十路老熟女| 亚洲欧美日韩国产丝袜自拍中文| 少妇专区一二三四五| 美女丝袜激情小说| 夫妻日逼| 金莲网址| 91肏屄网| 久久大香蕉97| 一区二区乱码福利| 国产在线精品偷| 蜜臀国产AV中文字幕| 天美一区在线| 亚洲精品九九九| 日韩少妇一区二区三区| 中文字幕一区二区三区人妻少妇在线| 99蜜月精品久久| 久久伊人最新网址视频| 午夜无码精品免费看性色| 亚洲天天艹| 亚洲性猛交| 色原狠狠天天天| 日韩精品人妻一| 久久九操在线观看| 国产在线视频二区| 我中文字幕6区| 天天综合欧美| 麻豆 欧美 日韩| 亚洲人妻久久| 中文字幕奈奈美被公侵犯| 欧美综合区| 欧美翘臀视频网站一区二区三区| 任你爽视频| 性性久久| 久久五月丁香| 国产精品亚洲一级av第二区| 色一色综合网| 好一吊区二区| 丁香五月激情综合| 国产无码久久高清| 国产精品视频| 嫩草影院性色| 中文乱码字幕观看| 懂色AV中文| 亚洲中文一区二区三区| 亚洲日韩狠狠撸视频| 欧美日韩高潮喷水91| 欧美精品三区| 骚女高跟AV在线| 无码精品一区二区三区潘金莲| 大香蕉97久久| 久久人爽| 久久久久9| 亚洲无码久久久久久久| 国产99999| 亚洲欧洲无码97久久精品| 国产A v无码专区| 久久99久久99精品天美传媒棢·纸:.| 91 手机在线播放 绯色| 亚洲成人日韩小说| 天天综合色图| 91 综合 色| 五月婷婷激情网| 97爱啪| 久久九九视频九九视频| 国产精品视频自拍在线| 欧美色亚洲色| 嗯啊啊啊轻点视频| 天堂种子在线www网资源| 国产高清自拍视频| 亚洲第一页综合在线| 日韩AV片| 久久亚洲欧美中文字幕国语| 亚洲网污污污污| 午夜精品久久久久久久男人的天堂| 伦激情人妻另类人妻| 极品出轨视频网站| 日日干夜夜欢| 亚洲第一页欧美| 婷婷爱五月| 亚乱色| 国产精品露脸在线观看| 亚洲人妻久久| 久艹视频在线| 无码丰满熟妇一区二区浪潮AV| 麻花豆传媒剧国产MV出差| 一品道视频一区二区三区| 噜噜噜在线视频| 日韩电影在线观看网址| 午夜在线播放| 春色综合免费| 综合情欲网| 精品性爱久久视频| 97精品视频免费| 天天综合91在线| 开心五月婷婷激情| 中文字幕性感少妇av| 围产精品一区二区三区视频播放| 777AV电影| 欧美A片中文字幕| 一区AV| 日韩日本欧美在线观看| 东京热男人的天堂| 久久伊人最新网址视频| 久久专区| 亚洲国产精品V?在线播放| 日本色色色网站免费看不卡| aa片毛片| 中文字幕乱码人妻二区三区| 亚洲成人性爱网站在线播放| 亚洲av综合色区图片亚洲| 国产精品第一区第一页| 翔田千里一区二区三区奶水| 粉嫩粉嫩一区性色AV片| 亚洲乱码国产乱码精网站| 久久直播国产| 中文字幕av乱伦| 亚洲精品久久久久久久蜜桃臀| 曰韩av中文字幕专区| 久热伊人| 久久久精久久久| 九九热五区| 区一二区日韩亚洲乱码av电影| 国产综合久久久麻桃个| 亚洲加勒比久久日本道| 午夜男女爽爽大片免费观看| 最新岛国大片| 青青操狠狠撩| 91 偷| 久久精品国产97欧美精品亚洲 | 国产精品乱码久久久久久久久| 欧美第五页| 久操国产在线| 日韩综合成人免费视频| 在线a v| 色婷五月| 久久夜嗨| 97日韩超碰超碰中文字幕| 五月丁香黄色网| 大香网站| 国产性感在线观看| 人乳av| 无码久久亚洲高清,| 黑人无码一区二区| 国产九九久久久精品| 亚洲熟女一区| 张柏芝国产一区在线观看| 日韩 欧美 视频 在线 一区| www.狠狠干.coom| 爱妻综合网| 日韩无码极品| 日本黄 R色 成 人网站| 日日夜夜国产综合| 无码人妻一区二区三区免费九色| japan日本高清乱xxxx| 欧美日韩超碰在线| 美女天天干| 中文字幕一区二区日韩网| 欧洲色| AV色五月天| 亚洲 欧美 日韩 国产一区二区| 久久无码成人| 国产精品人人爽人人做可爱福利| 色婷婷五月综合| 懂色中文一区二区三区| 在线毛片片免费观看| 亚洲aV性爱| 男人把坤坤插入女人的下体| 精品无码久久久久久久久果冻糖心| 国产1769在线| 国产白丝在线| 天天日天天干天天色| 亚洲日韩一区电影| 加勒比99999| 日韩丝袜二区| 亚州欧美综合| 亚洲黄色a级片| 91爰爱欧美| 综合av社区| 东京成人一区| 男女日B国产| 色呦呦、国产精品| 黑人免费福利视频| 刺激性视频黄页| 91性色| 欧美人妻精品| 丰满人妻aA一区二区三区| 日韩免费人妻色情网站| 久久精品黄色| 男人天堂.AB| 曰韩人妻中文字幕在线| 九九久久首页| 一级二级三级黑人无码| 五十路熟女工口| 日韩在线一区二区| 久久久久久久9最新免费视频观看| 一级特黄aaa大片在线观看成人一级片在线观看| 日本裸体久久色噜噜| 色色毛片| 久久这里| 思思热免费视频观看| 男人的天堂三级| 免费网站观看www在线观| 色综合一本| 330Dv国产女人终合视频极品人与兽| 日韩精品资源专区二区| 伦在线97| 十八禁视频网站| 亚洲国产日韩精品久久久| 欧美性天天影视| 亚欧无码线免费观看视频| 天天干天天日天天射黄色片| 综合影视国产无码| 992大香蕉| 国产久久久9999| 成人av影院在线观看| 欧美综合 站| 久99热| 亚洲黄色视频在线观看视频| 97超碰免费生活| a在线视频免费观看| 少妇久久久久久久久| 天天日天天舔东京热 | 看一级黄色视频| 夜夜嗨视频| 欧美 日韩 另类 亚洲| 亚洲成A∨人影院在线欢看| 日韩九九九| 夜夜嗷嗷一区二区| 免费看日产一区二区三区| 色牛aV| 大干人妻| 伊人久久国产免费观看视频| 3p国产色噜噜一区| 日韩免费在线观看不卡| 台湾佬中文娱乐网久久久久久久久久com| 97久久久| 人妻 丝袜美腿 中文字幕| 91中出视频| av天天在线| 亚洲中文字幕噜噜噜久久久| 四虎影视永久在线免费| 91网站18禁| 免费草草草草草视频| 欧美嗯啊……在线观看视频免费| 操逼不卡中文字幕| 成人国产视频在线观看| 青青草在线视频播放器| 日本人妻天堂网站在线播放| 国产精品交换一区二区| 被体育老师抱着c到高潮| A级国产欧美激情在线| 天天影视综合色| 久久久性| 久草免费在线视频| 日本高清视频在线观看黄已三辽| 亚洲第一页欧美| 91久久久久免| 国产激情片在线观看| 午夜超爽| 亚洲国产精品成人综合| 久久久96| 97资源久久| 蜜臀99久久精品久久久久久| 亚洲日韩乱码中文无码蜜桃臀网站 | 五月婷婷综合网| 国产黄色 A 片免费看| 青娱乐福利99| 尤物网站91| 97av在线观看| 欧美色青| 中国特猛少妇色xxx| 正宗无毛一线天嫩逼| 日韩黄色小说| 女上位精品在线| 97视频新免费| 久久久久久久久久精| 1二区9| 九九热视频这里只有精品| 怡红院怡春院| 久久精品亚洲东京热色播| 97精品国产97久久久| 67914亚洲精品| 熟女丰满人妻一区| 午夜精品99久久久久传媒| 国内91熟女人妻丝袜天天精品视频在线 | av中文在线| 色久综合| 亚洲午夜免费狠狠干| 免费观看欧美日韩操逼视频| 天天综合色| 欧美天天插| 射丝袜高跟鞋99| 伊人国产av| 国产日韩人人| 蜜桃视频啊啊啊啊| 欧美第五页| 色综合91好| 午夜性生活av免费在线看| 丰满人妻aA一区二区三区| 国产成人拍国产亚洲精品| 亚洲日韩视频二区| 91操人| 人妻AV在线| 99中出在线| 青青草精品| 韩国嫰模上门援交视频| 激情小说激情视频| 黄色无码高清黄色无码网站| 欧美性生活男人的天堂| 亚洲欧美在线观看2021| 97婷婷色| 中文乱码99| 女上位精品在线| 欧洲精品一级二级精品综合视频综合| 99久久亚洲精品无码毛片潘甜甜| 无码高清国产AV| 久久激情五月| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产无马av| 欧美亚洲影视| 欧美综合网1| 久久老熟女| 久久岛国| A V少妇特黄三级| 成人麻豆av电影网站| 日韩性爱再线视频| 91老司机精品| wuyechaopeng| 国产在线观看一区二区三区| 亚洲系列第一页| 超碰 另类 欧美| 亚洲图片欧美色| 久久日韩毛| 日韩人妻无码精品系列| 天天天天干| 日韩精品作爱导航| 天天做天天爱| 国产高清成人传媒影视| 免费人人搞97| 深夜视频| 性爱乱伦网址| 97色97好| 国产97在线 | 亚洲| 青青久久手机线视频| 人妻天天爽夜夜爽爽| 少妇久久久免费| 最新av网站在线观看| 婷婷色网| 偷拍亚洲情色| 国模不卡| 狠狠干精品一二三四五六2022| 久久有码视频| 91快色色色色色| 91伊人大香蕉| 精品一区二区三区国产| 色色综合网站| 亚洲少妇自拍中文字幕懂色| 色五天伊人| 96AV久久久| 欧美色网| 91九久| 天天肏天天干| 婷婷五月天av| 伊人九九九| 91超碰人人操| 加勒比久久av| 每日更新AV| 午夜精品久久999热蜜桃介男人用| 日韩欧美性吧婷婷乱伦大香蕉 | 2019AV天堂| 国产高清视频无码在线| 日本久久久久久久久| 天天干人人乐| 色蜜AV| 91综合站| 麻豆亚洲Av成人无码一区精品| 夜夜久久久| 18禁美女裸体无遮挡啪啪| 精品久久99| 欧美.亚洲.另类.丝袜.制服.诱惑| 国产精品一区在线播放| 不卡免费av在线播放| 999熟女精品| 91精品伊人久久久大香线蕉91| 日日日大屁股骚女人精品| 污污汅18禁网站在线永久免费观看| 亚洲熟妇熟在线电影视频| 操b在线观看| 97久久精品国产| 夜夜操青青草| 蜜桃丰满熟妇av无码区不卡| 国产AV激情无码久久无码| 色偷偷人人玩人人舔人人操人人摸人人爽| 中文字幕一区二区日韩网| 日本新免费二区三区| 2021久久国产综合精品青草| 肉丝中文无码高清| 99热免费| 网站A V在线| 好舒服视频| 日本在线视频导航| 91综合网在线| 欧美精品91| 日人妻视频91| 日日骚中文字幕| 91天天综合网,天天综合网| 天天干干天天干干| 亚洲玖玖爱| 看看小穴| 18禁精品网站在线看| 久久成人东京热人妻| 99热亚洲天堂| 天天看天天在线精品| 亚洲精品九九九九九九| AV天天综合| 女人 A一级| 日本二三四区| 鸥美插入视频| 五月丁香狠狠爱| 在线人成亚洲视频免费观看| 69丨亚洲丨精品丨入口免费播放| www五月| 亚洲视频1区| 久久三区四区| 美女诱惑在线一区| 色色色综合网| A 在线网址| 国产综合久久久麻桃个 | 热99这里有精品综合久久| 97一区二区三区视频| 五月天激情综合网| 欧美色视频在线| 丝袜足交视频| 亚洲s色图| 婷婷国产精品九区| 少妇无码999| 亚洲,日韩,欧美,成人播放| 亚洲欧美中日韩| 天天操天天舔| 日韩精品国产一区二区| 青娱乐av在线| 国产精品999aaa| 久久人妻一区二区三区高清| 97一区二区蜜臀| JULIA一区二区三区在线播放| 人人妻碰人人免费| 人爽不卡视频| 夫妻AV网站| 欧美少妇色综合| 蜜臀精品1区2区| 首页亚洲国产高跟丝袜诱惑视频 | 人妻AV 中文字幕的| 亚洲天堂人妻熟妇视频| 蜜乳中文字幕a在线| henhen91| 男人午夜天堂| 日韩精品-原创伙伴| 日韩熟女视频二区| 久啪| 操一区| 中文在线久久字幕| www.操| 成 人 影视 一区 二区 三区 四区 | 亚州精品一区二区三区香中文字幕在线| 亚洲第一黄色av网站| 99视频这有这里有精品| 少妇一级无码精品| 婷婷超| 狠狠爱综合网| 欧美裸体美女日麻屄| 九九热国产| 亚洲欧美清纯| 性色A∨91| 中文久久久| 丰满人妻一区二区三区| 女生久久网| 精品九九九九九九| 久久久97| 四虎国产精品永久在线囯在线| 伊人加勒比| 日本成人在线不卡一区二区三区 | 久久久婷婷| 丰满人妻-区二区三区免费| 天天干,天天日| 国产亚洲一黄| 99re这里只有精品中心播放| 中文字幕国产精品1区| 欧美久久草熟女| 白丝1区2区3区| 久久久久久久久久久久久久久乱码| 久久这里都是精品| 另类亚洲图色| 涩涩久久精品| 久久久性少妇| 99在线精品视频| 手机看片91人妻| 精品国产一区二区三区四区在线看| 欧美一级久久久丰满| 综合影视国产无码| 天天爽天天干| 日本三级人妻a人妻一在线| 97在线欧洲| 久久久久国产精品人妻aⅴ天堂| 加勒比无码毛片| 91老熟女| 手机在线播放国产福利| 国产精品久久久鸭无码的功能| 色婷婷电影网| 你草精品在线视频| 丁香7月婷婷| 久久青青草在线视频| 久久久99免费| 人人插人人搞人人操| 一品道视频一区二区三区| 亚洲大色堂| 精品在线78| 尹人免费观看视频在线| japan日本高清乱xxxx| 99操| 97一区二压| 青草一区二区| 欧美一级久久久久久久大片动画| 欧美黄片视频在线观看免费| 欧美丰满少妇交换91欧美精品| 粉嫩av一区二区三区天美传媒| 国产成人91一区二区三区| 殴美在线AⅤ| 久久a久久| 欧美综合色综合| 亚欧色图在线激情| 伊人女女资源在线观看| 人妻天天爽夜夜爽爽| 亚洲清纯唯美| 亚洲āv网址在线观看| 国产精品一区二区黄片| 青青操少妇| 资源新线在线天堂| 久久高清欧美国产| 大香蕉伊人在线成人AV在线观看| 久久久性少妇| 日日噜噜夜夜狠狠视频无| 综合色图亚洲欧美| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 天天欧美| 91成人在线免费视频| 青青草黑寡妇男人天堂| 麻豆天美在线| 亚洲精品aa久久伊人| 樱花草社区www中国| 91丝袜在线观看| 久久久国产三级黄色片| 久偷拍欧美日韩三区| 秋霞午夜成人福利片片| 色婷婷综合网| 91大香蕉伊人| 国产精品宅男免费| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 国模无码人体一区二区三| 亚洲欧美精品91| 人妻另类| 人人射人人操人人摸| 亚州熟妇精品| 可以在线观看的黄色网址| 亚洲码和欧洲精品激情系列| 风月影院十八禁| 人妻熟女一区在| 久久久久成人网| 天天爽人人综合免费7799| 职场同事知名国产国产精品久久欧美日韩 | 免费观看啪视频| 熟妇无码视频三区| 九九探花视频在线观看| 欧美一二三| 国产原创自拍| 欧美中文字幕一区| 91精片| 精品久久久九九九孕妇| 成人国产二区三区在线,男女精品。| 99久久精品国产高潮| 91大胆欧美| 日操粉逼逼| 97超碰9| 婷婷超| 亚洲人成色9999精品久久 | 大香蕉手机在线| 日韩熟女视频二区| 岛国A V在线免费看| 香蕉一区二区三区在线视频| av网站免费看| 夜夜操老骚逼视频网站| 亚洲国产美女久久久久| 亚洲 欧美 另类 综合 偷拍| 美国日韩黄片| 91久久堂| 亚洲精品一区二区三区在线播放| 91激情综合| 婷婷亚洲五月***久久| 可乐操亚洲蜜911| 久久午夜伦| 视频一区二区免费在线| 台湾大香蕉99热| 色嗨嗨在线| 蜜臀在线网站| 啊啊啊好爽快点啊啊啊嗯嗯| 美女被啪到深处抽搐视频| 超碰1024久久| 国产又操| 久草在线| 青青草乱入乱欲视频在线观看| 成人激情无码在线视频| 大色网久久| 欧美综合97www| 欧美日本中字另类在线| 黑人精品欧美一区二区蜜桃| 日韩欧美视频青青| 国产美女销魂在线观看不卡| 久久精品高清无码一区| 婷婷激情五月| 99久久久久久亚洲精品不卡| 日韩不卡一二三四| 2020视频1区2区3区| 亚洲色图尤物视频 | 亚洲AV无码成人精品久久| 酒色综合网| 二三四区精品| 日产狠狠干| 一起草欧美| 亚洲色阁| 97精品中文字幕| 老鸭窝亚洲毛片| 日本国产高清色www视频在线| 另类欧美色| 内射黑丝袜| 99r九九| 青娱乐日韩无码| 啪啪啪精品| 91精品网站| 亚州九九九精品视频| 九色 人妻 大香蕉| 欧美系列在线一区二区| 国产精品午夜AV完会免费| 另类欧美| 久久久久七视频| 精品久久一区二区三区四区五区| 黑人白女精品一区| 综合夜夜| 欧美视频一区二区三区| WWW.加勒比人妻一区不卡.com| 99久热| 国产 v乱码一区二| 超碰无码加勒比| 试看日韩黄片| 9久久久久久| 性色高清..……| 人妻酒店出差被中出免费在线播放| 日日夜夜狠狠| 高清无码国产亚洲| 精品亚洲国产成人av网站| 国产品精品自在在线午夜免费| 美女天天干| 九九av| 日韩精品操少妇| 在线 亚洲 网爆 自拍| 久久久久成人蜜桃精品| 色婷婷五月综合激情中文字幕| 骚人妻少妇视频| 麻豆av一区二区| 亚洲久久东京热一二三四五区视频| 97色论| 婷婷色一区| 六月婷婷综合| www.99在线| 人人操人人狠狠操| 日本在线视频导航| 国产区性爱在线视频秋霞豆| 人人 操人人 操人人| 色视频蜜乳| 热思思免费视频| 欧美成人免费在线观看| 精品91日日夜夜超清资源| 成人小电影网站tex| 欧美精品激情| 欧姜老司机| 亚洲色交| 91丨人妻丨国产丨丝袜| 99re这里只有精品9| 亚洲情欲| 亚洲九九九| 台湾一区国产高清在线| 黄色免费一级在线毛片| 超碰精品日韩欧美国产| a男人的天堂久久一级A毛片| 亚洲性爱成人| 中文人妻av高清一区| 国产久久成人| 日韩国产成人自拍视频| 欧洲一级性爱视频在线观看| 日日碰狠狠添天天爽超| 99热在线观看| 欧美 亚洲 综合 制服| 欧美熟妇乱码在线一区| 丰满少妇高潮无码| AV色五月天| 久久黄黄黄|