From d54f58a218fe4a2ae9ec45124cacaa70e243d5d0 Mon Sep 17 00:00:00 2001 From: yuanjiajia <1139393632@qq.com> Date: Sat, 7 May 2022 12:23:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ply=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/loadObjDemo.php | 4 ++-- src/core/LoardObj.php | 34 +++++++++++++++++++++++----------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/examples/loadObjDemo.php b/examples/loadObjDemo.php index 0ff7b8d..3837eee 100644 --- a/examples/loadObjDemo.php +++ b/examples/loadObjDemo.php @@ -9,8 +9,8 @@ include dirname(dirname(__FILE__)) . "/vendor/autoload.php"; ini_set('memory_limit','4096M'); -$ply = new LoardObj('/home/yuanjiajia/Desktop/blender/test/3D.obj',LoardObj::CLOSE); -$ply = $ply->toPly(); +$ply = new LoardObj('/home/yuanjiajia/Desktop/blender/test/202112201847576528.obj',LoardObj::CLOSE); +$ply = $ply->toPly(null,LoardObj::TYPE_TXT); var_dump($ply ); diff --git a/src/core/LoardObj.php b/src/core/LoardObj.php index 12dff71..a6d0528 100644 --- a/src/core/LoardObj.php +++ b/src/core/LoardObj.php @@ -40,7 +40,8 @@ class LoardObj } /** - * @param string $format 储存 ply模型 的格式 + * @param string $path ply模型 保存路径 + * @param string $format ply模型 保存格式 */ public function toPly( string $path = null,string $format = self::TYPE_BINARY) { @@ -151,10 +152,12 @@ class LoardObj foreach( $this->objData['meshs'] as $meshs_key => $meshs_value ) { - $ply = []; - $vCount = 0; - $fCount = 0; - + $ply['vertex'] = []; + $ply['face'] = []; + $ply['header'] = []; + $indexesList = []; + $vConst = 0; + foreach( $meshs_value as $face_value ) // 生成顶点和面数据 { $face_value = implode('/', $face_value); @@ -178,23 +181,32 @@ class LoardObj case 0; $vn = $this->objData['vn'][$v_value-1]; - $ply['vertex'][$vCount] = implode(' ',$v).' '.implode(' ',$vn).' '.implode(' ',$vt); - $lineFace[] = $vCount; - $vCount++; + $vnt = implode(' ',$v).' '.implode(' ',$vn).' '.implode(' ',$vt); + $hashVar = hash('md5', $vnt); + if( !array_key_exists($hashVar, $indexesList) ) + { + $ply['vertex'][$vConst] = $vnt; + $lineFace[] = $vConst; + $indexesList[$hashVar] = $vConst; + $vConst++; + } + else + { + $lineFace[] = $indexesList[$hashVar]; + } break; default: ; } } - $ply['face'][$fCount] = count($lineFace).' '.implode(' ',$lineFace); - $fCount++; + $ply['face'][] = count($lineFace).' '.implode(' ',$lineFace); } $ply['header'][] = 'ply'; // 生成头部数据 $ply['header'][] = "format "; $ply['header'][] = "comment Created by reaiyunju, source file: ''"; - $ply['header'][] = "element vertex ".$vCount; + $ply['header'][] = "element vertex ".$vConst; $ply['header'][] = "property float x"; $ply['header'][] = "property float y"; $ply['header'][] = "property float z";