BufferGeometry
Object3D
Raycaster
Camera
CubeCamera
PerspectiveCamera
OrthographicCamera
StereoCamera
Clock
Curve
CurvePath
Path
Shape
ShapePath
ArrowHelper
AxesHelper
BoxHelper
Box3Helper
CameraHelper
DirectionalLightHelper
GridHelper
PolarGridHelper
HemisphereLightHelper
PlaneHelper
PointLightHelper
SkeletonHelper
SpotLightHelper
Light
PointLight
RectAreaLight
SpotLight
DirectionalLight
HemisphereLight
LightShadow
PointLightShadow
AnimationLoader
AudioLoader
BufferGeometryLoader
CompressedTextureLoader
CubeTextureLoader
DataTextureLoader
FileLoader
ImageBitmapLoader
ImageLoader
Loader
LoaderUtils
MaterialLoader
ObjectLoader
TextureLoader
LoadingManager
Material
Box2
Box3
Color
Cylindrical
Euler
Frustum
Interpolant
Line3
MathUtils
Matrix3
Matrix4
Plane
Quaternion
AnimationAction
AnimationClip
AnimationMixer
AnimationObjectGroup
AnimationUtils
keyframeTrack
PropertyBinding
PropertyMixer
BooleanKeyframeTrack
QuaternionKeyframeTrack
StringKeyframeTrack
Audio
AudioAnalyser
AudioContext
AudioListener
PositionalAudio

Loader.parse()

Loader.parse() 是Three.js加载器中的一个工具方法,用于处理特定格式的数据并返回可供Three.js使用的几何信息对象。

参数

  • data: Object / ArrayBuffer / AudioBuffer / string / Blob。需要处理的数据,可以是对象、二进制数据、字符串、音频缓冲区或Blob。

  • path: String。 可选参数,表示数据文件的路径。

  • onLoad: Function。可选参数,当数据加载完成后调用的回调函数。

  • onError: Function。可选参数,当数据加载错误时调用的回调函数。

返回值

解析后的几何信息,类型为 THREE.BufferGeometryTHREE.Geometry

示例

以下示例演示了如何使用 Loader.parse() 方法从 OBJ 文件的字符串数据中提取几何信息:

// ObjLoader.js 文件解析函数
function parse ( text ) {
  const vertexPattern = /^\s*v\s/;
  const normalPattern = /^\s*vn\s/;
  const uvPattern = /^\s*vt\s/;
  const facePattern1 = /^\s*f\s/;
  const facePattern2 = /^\s*(-?\d+)\s*(-?\d+)\s*(-?\d+)\s*(-?\d+)\s*/;

  const geometry = new THREE.Geometry();

  const vertices = [];
  const normals = [];
  const uvs = [];

  function addVertex ( x, y, z ) {
    vertices.push( float( x ), float( y ), float( z ) );
  }

  function addNormal ( x, y, z ) {
    normals.push( float( x ), float( y ), float( z ) );
  }

  function addUV ( x, y ) {
    uvs.push( float( x ), float( y ) );
  }

  function addFace ( a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd ) {
    const vertexIndices = [ a, b, c ];
    const uvIndices = [ ua, ub, uc ];
    const normalIndices = [ na, nb, nc ];
    if ( d !== undefined ) {
      vertexIndices.push( d );
      uvIndices.push( ud );
      normalIndices.push( nd );
    }

    const faceNormal = new THREE.Vector3();

    const vertexA = scope.vertices[ vertexIndices[ 0 ] - 1 ];
    const vertexB = scope.vertices[ vertexIndices[ 1 ] - 1 ];
    const vertexC = scope.vertices[ vertexIndices[ 2 ] - 1 ];

    faceNormal.fromArray( vertexNormals, normalIndices[ 0 ] * 3 );
    this.checkFaceNormal( faceNormal, vertexA, vertexB, vertexC );

    const face = new THREE.Face3( vertexIndices[ 0 ] - 1, vertexIndices[ 1 ] - 1, vertexIndices[ 2 ] - 1, faceNormal.toArray() );

    geometry.faces.push( face );
  }

  const lines = text.split( '\n' );

  for ( let i = 0; i < lines.length; i ++ ) {
    const line = lines[ i ];
    const lineFirstChar = line.charAt( 0 );

    if ( lineFirstChar === 'v' ) {

      const data = line.split( ' ' );

      switch ( data[ 0 ] ) {
        case 'v':
          addVertex( data[ 1 ], data[ 2 ], data[ 3 ] );
          break;
        case 'vn':
          addNormal( data[ 1 ], data[ 2 ], data[ 3 ] );
          break;
        case 'vt':
          addUV( data[ 1 ], data[ 2 ] );
          break;
      }

    } else if ( lineFirstChar === 'f' ) {

      const lineData = line.substr( 1 ).trim();
      const vertexData = lineData.split( ' ' );
      const faceVertices = [];

      for (let j = 0; j < vertexData.length; j ++ ) {
        const vertex = vertexData[ j ];

        if ( vertex.length > 0 ) {

          const vertexParts = vertex.split( '/' );
          faceVertices.push( parseInt( vertexParts[ 0 ] ) );

        }

      }

      const vertexCount = faceVertices.length;

      if ( vertexCount === 3 ) {

        addFace( faceVertices[ 0 ], faceVertices[ 1 ], faceVertices[ 2 ] );

      } else if ( vertexCount === 4 ) {

        addFace( faceVertices[ 0 ], faceVertices[ 1 ], faceVertices[ 2 ], faceVertices[ 3 ] );

      }

    }

  }

  geometry.vertices = new Float32Array( vertices );
  geometry.uvs = new Float32Array( uvs );
  geometry.normals = new Float32Array( normals );

  geometry.computeBoundingBox();
  geometry.computeBoundingSphere();

  return geometry;
}

// main.js 文件
const loader = new THREE.OBJLoader();

// 从字符串数据中提取几何信息
const geometry = loader.parse(obj_string_data);

// 创建网格并渲染到场景中
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

注意事项

在使用 Loader.parse() 方法时,需要根据加载的数据类型编写对应的解析函数,将数据格式化为可供 Three.js 使用的几何信息对象。