C#을(를) 통해 U3D에서 자산 추출
서버 측 API를 사용하여 U3D 파일에서 자산을 추출하는 고유한 .NET 앱을 빌드합니다.
C#을 사용하여 U3D 파일에서 자산을 추출하는 방법
U3D 파일에서 자산을 추출하기 위해 다음을 사용합니다.
API은(는) 추출 자산과 함께 사용할 C# 플랫폼을 위한 풍부하고 강력하며 사용하기 쉬운 API입니다. 열려있는
패키지 관리자, 검색 Aspose.3D 설치합니다. 패키지 관리자 콘솔에서 다음 명령을 사용할 수도 있습니다.
패키지 관리자 콘솔 명령
PM> Install-Package Aspose.3D
C#을(를) 통해 U3D에서 자산을 추출하는 단계
Aspose.3D를 사용하면 개발자가 몇 줄의 코드로 U3D 파일에서 자산을 쉽게 추출할 수 있습니다.
- Scene 클래스의 생성자를 통해 U3D 파일 로드- zip 파일 형식 개체를 출력 파일 형식으로 생성- 아카이브 클래스 생성 및 자산 클래스 추출 처리- Extract 메서드를 호출하고 파일을 저장합니다.
시스템 요구 사항
Aspose.3D for .NET은(는) 모든 주요 운영 체제에서 지원됩니다. 다음 전제 조건이 있는지 확인하십시오.
- Microsoft Windows 또는 .NET Framework, .NET Core, Mono 호환 OS- Microsoft Visual Studio와 같은 개발 환경- 프로젝트에서 참조된 Aspose.3D for .NET
U3D에서 자산을 추출하는 C# 코드
//자산을 추출해야 하는 소스 파일
string file = "template.u3d";
Scene scene = new Scene(file);
//출력은 압축 파일 형식이며 Directory는 기존 폴더의 이름을 나타냅니다.
var zipOutput = Path.Combine("Directory", "OutputFile.zip");
using var output = new FileStream(zipOutput, FileMode.Create);
using var za = new Zip(output);
//Extract 메서드를 호출하여 자산 추출 작업 수행
Extract(scene,za,true);
//호출 가능한 Extract 메서드, 매개변수 텍스처는 텍스처를 추출할지 여부를 나타냅니다.
private void Extract(Scene scene, Zip za,bool texture)
{
var extractor = new Extractor(za,texture);
extractor.Extract(scene);
}
//압축 파일 처리 클래스 생성
class Zip : IDisposable
{
private ZipArchive archive;
private HashSet<string> entries = new HashSet<string>();
public Zip(Stream stream)
{
archive = new ZipArchive(stream, ZipArchiveMode.Create);
}
public void Dispose()
{
archive.Dispose();
}
public void Add(string fileName, byte[] content, bool enableCompression)
{
var entryName = PickName(fileName);
var compressionLevel = enableCompression ? CompressionLevel.Fastest : CompressionLevel.NoCompression;
var entry = archive.CreateEntry(entryName, compressionLevel);
using var stream = entry.Open();
stream.Write(content, 0, content.Length);
}
private string PickName(string fileName)
{
if (!entries.Contains(fileName))
{
entries.Add(fileName);
return fileName;
}
var baseName = Path.GetFileNameWithoutExtension(fileName);
var ext = Path.GetExtension(fileName);
for (var idx = 2; ; idx++)
{
var newName = baseName + "_" + idx;
if (!string.IsNullOrEmpty(ext))
newName += ext;
if (entries.Contains(newName))
continue;
entries.Add(newName);
return newName;
}
}
}
//자산 추출 처리 클래스 생성
class Extractor
{
private Zip zip;
private bool texture;
HashSet<A3DObject> visited = new HashSet<A3DObject>();
public Extractor(Zip zip,bool texture)
{
this.zip = zip;
this.texture = texture;
}
private bool CanVisit(A3DObject obj)
{
if (visited.Contains(obj))
return false;
visited.Add(obj);
return true;
}
public void Extract(Scene scene)
{
if (scene.Library != null && scene.Library.Count > 0)
{
foreach (var obj in scene.Library)
{
Visit(obj);
}
}
VisitNode(scene.RootNode);
}
private void VisitNode(Node node)
{
if (!CanVisit(node))
return;
if (texture)
{
foreach (var mat in node.Materials)
{
VisitMaterial(mat);
}
}
foreach (var entity in node.Entities)
{
if (entity is Mesh)
Save((Mesh)entity, node.Name);
}
foreach (var child in node.ChildNodes)
{
VisitNode(child);
}
}
private void VisitMaterial(Material mat)
{
if (!CanVisit(mat))
return;
if (!texture)
return;
foreach (var tslot in mat)
{
if (tslot.Texture is Texture)
{
Save((Texture)tslot.Texture);
}
}
}
private void Visit(A3DObject obj)
{
if (texture && obj is Texture)
{
Save((Texture)obj);
}
else if (obj is Mesh)
{
Save((Mesh)obj, null);
}
else if (obj is Node)
{
VisitNode((Node)obj);
}
}
private void Save(Mesh mesh, string? nodeName)
{
if (!CanVisit(mesh))
return;
Scene scene = new Scene(mesh);
using (var ms = new MemoryStream())
{
scene.Save(ms, FileFormat.FBX7400ASCII);
var name = nodeName;
if (string.IsNullOrEmpty(name))
name = mesh.Name;
if (string.IsNullOrEmpty(name))
name = "mesh";
var ext = ".fbx";
zip.Add(name + ext, ms.ToArray(), true);
}
}
private void Save(Texture tex)
{
if (tex.Content == null || !CanVisit(tex))
return;
var fileName = tex.FileName != null ? Path.GetFileName(tex.FileName) : null;
zip.Add(fileName, tex.Content, false);
}
}
Aspose.3D for .NET API 정보
Aspose.3D은(는) 3D 파일을 로드, 수정 및 변환하는 CAD 및 Gameware API입니다. API는 독립 실행형이며 3D 모델링 또는 렌더링 소프트웨어가 필요하지 않습니다. Discreet3DS, WavefrontOBJ, STL(ASCII, 바이너리), Universal3D, FBX(ASCII, 바이너리), Collada, glTF, PLY, GLB, DirectX 및 기타 형식.U3D에서 자산을 추출하는 무료 앱
라이브 데모를 확인하려면 추출기 U3D 다음과 같은 혜택이 있습니다.
U3D U3D 파일 형식이란 무엇입니까?
U3D(Universal 3D)은 3D 컴퓨터 그래픽용 압축 파일 형식 및 데이터 구조입니다. 여기에는 삼각형 메쉬, 조명, 음영, 모션 데이터, 색상 및 구조가 있는 선 및 점과 같은 3D 모델 정보가 포함됩니다. 형식은 2005년 8월에 ECMA-363 표준으로 승인되었습니다. 3D PDF 문서는 U3D 개체 임베딩을 지원하며 Adobe Reader(버전 7 이상)에서 볼 수 있습니다.
더 읽기형식에서 자산을 추출하기 위해 지원되는 기타 앱
C#를 사용하면 다음을 비롯한 여러 파일 형식에서 자산을 추출할 수도 있습니다.