我找到了一个将 m3 文件(星际争霸 2 中使用的 3D 模型)转换为 obj 文件的脚本,但我不知道如何使用它。我得到的所有信息都是“好吧,这是脚本。”,所以我真的不能给你太多信息,除了我以前从未听说过 PHP 这一事实。
以下是脚本
<?php
#########################
# $argv[1] can be edited to any custom path
#########################
$temp = explode(".m3", $argv[1]);
$file = $argv[1];
$path = $temp[0];# "./Assets/Doodads/AiurTree/AiurTree_06";
echo("Exporting Model $path to $path.obj\n\n");
$file = fopen($file, 'rb') or die("Failed to open $file!\n");
if(fread($file,4) != "33DM") die("Failed! File is not a StarCraft 2 model!\n");
fseek($file, 4); # find where tags start
$index = unpack(V, fread($file, 4));
# search for __8U "5F 5F 38 55" tag for vertex offset
$offset = $index[1];
while(1){
fseek($file, $offset+16);
$string = fread($file, 4);
if ($string == '__8U'){
$offset+=20;
break;
}
$offset++;
}
fseek($file, $offset);
$index = unpack(V, fread($file, 4));
fseek($file, $offset+4);
$maxVerts = unpack(V, fread($file, 4)); # maximum extents
$maxVerts[1] = $maxVerts[1] + $index[1];
fseek($file, $offset+6);
$version = unpack(V, fread($file, 4)); # up to 7 versions currently known
if ($version[1] == 7 or $version[1] == 0){
$EOB = 4; # versions have different number of values after uv - value to reach end of block
} elseif ($version[1] == 1 or $version[1] == 2 or $version[1] == 3 or $version[1] == 6){
$EOB = 8;
} else {
$EOB = 8;
echo("Model not yet supported, report it to Teal\n");
//die("Model not yet supported, report it to Teal");
}
echo("Model type $version[1]\n");
if ($version[1] == 2) echo("This model will have invalid UV coordinates... working on it.\n");
fseek($file, $offset+32); # face data
$indexFaces = unpack(V, fread($file, 4));
fseek($file, $offset+36);
$maxFaces = unpack(V, fread($file, 4));
$maxFaces[1] = $maxFaces[1]*2 + $indexFaces[1];
$i = 0;
$k = 0;
$offset = $index[1];
while(1){
if ($offset >= $maxVerts[1]) break;
for($j=0;$j<3;$j++){ # read verts
fseek($file, $offset);
$temp = unpack(f, fread($file, 4));
$vert[$i] = $temp[1];
$offset +=4;
$i++;
}
$offset+=12;
for($j=0;$j<2;$j++){ # read UV
fseek($file, $offset);
$temp = unpack(v, fread($file, 2));
if ($temp[1] > 2046){
$uv[$k] = $temp[1] / 65536;
} else {
$uv[$k] = $temp[1] / 2046;
}
$offset +=2;
$k++;
}
$offset+=$EOB;
}
$i=0;
$offset = $indexFaces[1];
while(1){ # read faces
if ($offset >= $maxFaces[1]) break;
fseek($file, $offset);
$temp = unpack(v, fread($file, 2));
$face[$i]=$temp[1];
$i++;
$offset+=2;
}
$out = fopen($path . ".obj", 'w+');
for($i=0; $i<sizeof($vert); $i+=3){
fwrite($out, "v " . $vert[$i] . " " . $vert[$i+1] . " " . $vert[$i+2] . "\n");
}
for($i=0; $i<sizeof($uv); $i+=2){
fwrite($out, "vt " . $uv[$i] . " " . (1-$uv[$i+1]) . "\n");
}
for($i=0; $i<sizeof($face); $i+=3){
fwrite($out, "f " . ($face[$i]+1) . "/" . ($face[$i]+1) . " " . ($face[$i+1]+1) . "/" . ($face[$i+1]+1) . " " . ($face[$i+2]+1) . "/" . ($face[$i+2]+1) . "\n");
}
fclose($out);
echo("Done!\n\n");
?>
我如何使用它?
答案1
您需要将脚本保存为名为 的文件script.php
(或任何带有 的文件.php
)。复制所有内容,将其粘贴到您选择的文本编辑器中。将其放在某个地方,最好放在/Users/your-username/script.php
或您喜欢的任何其他文件夹中。
php
现在您可以使用OS X 附带的二进制文件运行该脚本。
从以下位置打开 Terminal.app应用程序 → 实用程序. 输入以下行
php ~/script.php ~/file.m3
执行脚本。~
是主目录的缩写。当然,file.m3
也需要存在于主目录中,并且是您要转换的星际争霸文件。
生成的.obj
文件将大概放置在与m3
文件同一文件夹中。