2

ascii ply ファイルを正常にロードできるようになりましたが、テクスチャがあり、どのように構成してもロードできないようです。

    cameraMain = new THREE.Camera(8, MainWidth / MainHeight, 1, 10000);
sceneMain = new THREE.Scene();
ambientLightMain = new THREE.AmbientLight(0x202020);
directionalLightMainRight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLightMainLeft = new THREE.DirectionalLight(0xffffff, 0.5);
pointLightMain = new THREE.PointLight(0xffffff, 0.3);

directionalLightMainRight.position.x = dlpx;
directionalLightMainRight.position.y = dlpy;
directionalLightMainRight.position.z = dlpz;
directionalLightMainRight.position.normalize();

directionalLightMainLeft.position.x = -dlpx;
directionalLightMainLeft.position.y = dlpy;
directionalLightMainLeft.position.z = dlpz;
directionalLightMainLeft.position.normalize();  

pointLightMain.position.x = plpx;
pointLightMain.position.y = plpy;
pointLightMain.position.z = plpz;

sceneMain.addLight(ambientLightMain);
sceneMain.addLight(directionalLightMainRight);
sceneMain.addLight(directionalLightMainLeft);
sceneMain.addLight(pointLightMain);

rendererMain = new THREE.WebGLRenderer();
texture = THREE.ImageUtils.loadTexture('3D/'+ mainURL +'.jpg', {}, function() {
    rendererMain.render(sceneMain);
});

rendererMain.domElement.style.backgroundColor = backgroundColor;
rendererMain.setSize(MainWidth, MainHeight);
rendererMain.domElement.addEventListener('DOMMouseScroll', onRendererMainScroll, false);
rendererMain.domElement.addEventListener('mousewheel', onRendererMainScroll, false);
rendererMain.domElement.addEventListener('dblclick', onRendererMainDblClick, false);
rendererMain.domElement.addEventListener('mousedown', onRendererMainMouseDown, false);

$("#viewerMain").append(rendererMain.domElement);

window.addEventListener('mousemove', onMouseMove, false);
window.addEventListener('mouseup', onMouseUp, false);

そのコードのチャンクがモデルを初期化します。一部は質問目的には必要ありません。ズーム、回転などのコードがあります。別の行があることは知っています。コメントアウトしていますが、何らかの理由でここに表示されないため、個別に行います。

material = new THREE.MeshBasicMaterial({map: texture});

その行は、loadTexture コードの後に​​あります。

残りは loadPly 関数でロードされます

        var geometryMain = new THREE.Geometry();
    for (i in event.data.content[0])
      geometryMain.vertices.push(new THREE.Vertex(new THREE.Vector3(event.data.content[0][i][0], event.data.content[0][i][1], event.data.content[0][i][2])));
    for (i in event.data.content[1])
      geometryMain.faces.push(new THREE.Face3(event.data.content[1][i][0], event.data.content[1][i][1], event.data.content[1][i][2]));
    geometryMain.computeCentroids();
    geometryMain.computeFaceNormals();
    mainModel = new THREE.Mesh(geometryMain, new THREE.MeshLambertMaterial({color:0xffffff, shading:THREE.FlatShading}));
    sceneMain.addObject(mainModel);
    mainModel.overdraw = true;
    mainModel.doubleSided = true;

THREE.mesh() セクションを微調整してマテリアルを含めようとしましたが、すべてが壊れます。map:material を MeshLambertMaterial に追加しようとしましたが、これも失敗しました。誰にも洞察がありますか?これが複雑すぎる場合は申し訳ありませんが、私はこれが効率的であるために十分なことをまだ知りません。

追加すると

map:THREE.ImageUtils.loadTexture('3D/'+ mainURL +'.jpg')

THREE.Mesh() 行に、私は得る

.WebGLRenderingContext: GL エラー:GL_INVALID_OPERATION: glDrawElements: 属性 2 の範囲外の頂点にアクセスしようとしています

4

2 に答える 2

3

オブジェクトにテクスチャを表示するには、テクスチャ座標が必要です。ジオメトリに頂点と面を追加するだけのようです。ソースを見るとTHREE.PLYLoader、テクスチャ座標の読み込みをサポートしていないようです。Geometry(ただし、配列を手動で作成する必要はなく、すでに準備が整ったインスタンスを返す必要があるため、そのローダーを使用するかどうかはわかりません)

于 2013-04-20T08:43:12.867 に答える