Skip to content

重拓扑优化 (Remesh)

这是 3D 生产管线中至关重要的一环。生图模型直接产出的模型往往包含大量杂乱的三角面(Triangles),不仅渲染效率低,且无法进行高质量的骨骼动画蒙皮。本服务支持将杂乱网格重新分布为规整的四边面(Quads),实现模型减面与拓扑结构优化。

典型应用场景

  • LOD 优化:将超高面数模型优化为低模,适配移动端实时渲染
  • 动画管线适配:生成规整的四边面网格,确保骨骼绑定后的变形平滑自然

本页使用的 API 参考 POST /3d_models/remeshings

3D 模型传入方式

模型参数同样支持三种传入格式:

  • 前置任务结果:将文生模型或图生模型任务返回的 asset_path 直接使用,实现无缝串联
  • Base64 编码:传入 .glb 文件内容的 base64 字符串(不含 data: 前缀)
  • 公网 URL:传入可公开访问的 .glb 或其他支持格式文件链接

基础示例

bash
curl -X POST 'https://api.v2fun.ai/api/v1/3d_models/remeshings' \
  -H 'Authorization: Bearer $V2FUN_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
      "input_model": "models/example.glb"
    }'
javascript
const response = await fetch('https://api.v2fun.ai/api/v1/3d_models/remeshings', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer $V2FUN_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "input_model": "models/example.glb"
  }),
});
const data = await response.json();
python
import requests

resp = requests.post(
    'https://api.v2fun.ai/api/v1/3d_models/remeshings',
    headers={
        'Authorization': 'Bearer $V2FUN_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        "input_model": "models/example.glb"
    },
)
print(resp.json())
java
import java.net.URI;
import java.net.http.*;

HttpClient client = HttpClient.newHttpClient();
String body = "{\"input_model\":\"models/example.glb\"}";
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.v2fun.ai/api/v1/3d_models/remeshings"))
    .header("Authorization", "Bearer $V2FUN_API_KEY")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
HttpResponse<String> response = client.send(
    request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

核心用例

多级别 LOD 减面

通过设定 mesh_count,你可以快速生成同一资产的不同精度版本。例如,将 50 万面的原始模型一键优化为 1 万面的低模。

bash
curl -X POST 'https://api.v2fun.ai/api/v1/3d_models/remeshings' \
  -H 'Authorization: Bearer $V2FUN_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
      "input_model": "https://asset.v2fun.ai/upload/remesh-input-robot.glb",
      "mesh_count": 10000
    }'
javascript
const response = await fetch('https://api.v2fun.ai/api/v1/3d_models/remeshings', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer $V2FUN_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "input_model": "https://asset.v2fun.ai/upload/remesh-input-robot.glb",
    "mesh_count": 10000
  }),
});
const data = await response.json();
python
import requests

resp = requests.post(
    'https://api.v2fun.ai/api/v1/3d_models/remeshings',
    headers={
        'Authorization': 'Bearer $V2FUN_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        "input_model": "https://asset.v2fun.ai/upload/remesh-input-robot.glb",
        "mesh_count": 10000
    },
)
print(resp.json())
java
import java.net.URI;
import java.net.http.*;

HttpClient client = HttpClient.newHttpClient();
String body = "{\"input_model\":\"https://asset.v2fun.ai/upload/remesh-input-robot.glb\",\"mesh_count\":10000}";
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.v2fun.ai/api/v1/3d_models/remeshings"))
    .header("Authorization", "Bearer $V2FUN_API_KEY")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
HttpResponse<String> response = client.send(
    request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
输入模型
输出结果

四边面拓扑转换

将拓扑结构切换为 quad。四边面是动画师的最爱,因为它能完美遵循物体的受力形变,彻底解决骨骼动画中的“拉扯感”。

mesh_topology: triangle · quad

bash
curl -X POST 'https://api.v2fun.ai/api/v1/3d_models/remeshings' \
  -H 'Authorization: Bearer $V2FUN_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
      "input_model": "https://asset.v2fun.ai/upload/remesh-input-robot.glb",
      "mesh_topology": "quad",
      "mesh_count": 5000
    }'
javascript
const response = await fetch('https://api.v2fun.ai/api/v1/3d_models/remeshings', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer $V2FUN_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "input_model": "https://asset.v2fun.ai/upload/remesh-input-robot.glb",
    "mesh_topology": "quad",
    "mesh_count": 5000
  }),
});
const data = await response.json();
python
import requests

resp = requests.post(
    'https://api.v2fun.ai/api/v1/3d_models/remeshings',
    headers={
        'Authorization': 'Bearer $V2FUN_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        "input_model": "https://asset.v2fun.ai/upload/remesh-input-robot.glb",
        "mesh_topology": "quad",
        "mesh_count": 5000
    },
)
print(resp.json())
java
import java.net.URI;
import java.net.http.*;

HttpClient client = HttpClient.newHttpClient();
String body = "{\"input_model\":\"https://asset.v2fun.ai/upload/remesh-input-robot.glb\",\"mesh_topology\":\"quad\",\"mesh_count\":5000}";
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.v2fun.ai/api/v1/3d_models/remeshings"))
    .header("Authorization", "Bearer $V2FUN_API_KEY")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
HttpResponse<String> response = client.send(
    request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
输入模型
输出结果