さて、ついに回避策を見つけました!
キャンバスのテクスチャを交換する方法が間違っていました。バグだと思います。Psychok7によるこの回答の手がかりを見つけました。
さて、テクスチャをロードしてから変更する代わりに… ColladaLoader.js ファイルのコードを変更しました。まあ、ほとんど同じです。「ロード」を使用するので、ロード関数に imageReload を数回追加し、「解析」関数を呼び出すときに追加しました。次に、解析関数で、指定されたコードがリンクで間違っていたため、いくつかの変更も行いました。興味のある方のために、変更点のリストと最終的なコードを示します。悲しいことに、「同じ」機能 (テクスチャの配列を送信し、regExp を実行し、一度に複数のテクスチャを置き換える) を実現できませんでした。この部分はバグが多く、1 つのテクスチャ ファイルのみを変更する必要があったため、...< /p>
- 私はしません iamge.init_from = iR.new_image; regExp ループ内で...代わりに image.init_from = iR; を追加します。regExp の直前。
- 私のファイルで関数を呼び出すとき、私は配列を送信します... それは文書化されておらず、例もなく、理解するのに苦労しました. .png または .jpeg の URL を直接送信しようとしないでください。その名前を、その配列の前のテーブルと関数呼び出しに入れます。パスを削除することを忘れないでください。これは、collada ファイル内で説明されているパスと同じである必要があります (私の場合、collada ファイルはテクスチャと同じフォルダーを共有するため、テクスチャ名のみです)。
- Psychok のコードでは、"parseLib" 呼び出しに明らかに間違いがあり、 parseLib( "//dae:library_materials/dae:material", Material, "material" ); のようなものを書いています。parseLib( "library_materials material", Material, "material" ); の代わりに (これは機能しており、元のコードです)。
つまり、簡単に言えば、ここに私がコラーダを呼び出すコードがあります
loader = new THREE.ColladaLoader();
newtextures = ['dokMixer.png'];
loader.load('models/collada/7cm.005.dae', newtextures,function colladaReady( collada ){
player = collada.scene;
skin = collada.skins [ 0 ];
player.scale.x = player.scale.y = player.scale.z = 0.10;
//i'll add code here later for extra bump mapping on webgl versions
//usefull for shadows on webgl version
daemesh = player.children[0];
daemesh.castShadow = true;
daemesh.receiveShadow = true;
scene.add( player );
});
colladaLoader 内のコードは次のとおりです。関数 load と parse を置き換えるものです。
function load ( url, imageReplace, readyCallback, progressCallback ) {
var length = 0;
if ( document.implementation && document.implementation.createDocument ) {
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if( request.readyState == 4 ) {
if( request.status == 0 || request.status == 200 ) {
if ( request.responseXML ) {
readyCallbackFunc = readyCallback;
parse( request.responseXML, imageReplace, undefined, url );
} else if ( request.responseText ) {
readyCallbackFunc = readyCallback;
var xmlParser = new DOMParser();
var responseXML = xmlParser.parseFromString( request.responseText, "application/xml" );
parse( responseXML, imageReplace, undefined, url );
} else {
console.error( "ColladaLoader: Empty or non-existing file (" + url + ")" );
}
}
} else if ( request.readyState == 3 ) {
if ( progressCallback ) {
if ( length == 0 ) {
length = request.getResponseHeader( "Content-Length" );
}
progressCallback( { total: length, loaded: request.responseText.length } );
}
}
}
request.open( "GET", url, true );
request.send( null );
} else {
alert( "Don't know how to parse XML!" );
}
}
function parse( doc, imageReplace, callBack, url ) {
COLLADA = doc;
callBack = callBack || readyCallbackFunc;
if ( url !== undefined ) {
var parts = url.split( '/' );
parts.pop();
baseUrl = ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';
}
parseAsset();
setUpConversion();
images = parseLib( "library_images image", _Image, "image" );
for(var i in imageReplace) {
var iR = imageReplace[i];
for(var i in images) {
var image = images[i];
//added line, but no multiple textures !
image.init_from = iR;
//RegExp and patt.test not working
var patt=new RegExp('[a-zA-Z0-9\-\_]*\/'+iR.name,'g');
//if(image.id==iR.id)
//
if(patt.test(image.init_from))
image.init_from = iR.new_image;
}//for
}
materials = parseLib( "library_materials material", Material, "material" );
effects = parseLib( "library_effects effect", Effect, "effect" );
geometries = parseLib( "library_geometries geometry", Geometry, "geometry" );
cameras = parseLib( "library_cameras camera", Camera, "camera" );
lights = parseLib( "library_lights light", Light, "light" );
controllers = parseLib( "library_controllers controller", Controller, "controller" );
animations = parseLib( "library_animations animation", Animation, "animation" );
visualScenes = parseLib( "library_visual_scenes visual_scene", VisualScene, "visual_scene" );
// materials = parseLib( "//dae:library_materials/dae:material", Material, "material" );
// effects = parseLib( "//dae:library_effects/dae:effect", Effect, "effect" );
// geometries = parseLib( "//dae:library_geometries/dae:geometry", Geometry, "geometry" );
// cameras = parseLib( ".//dae:library_cameras/dae:camera", Camera, "camera" );
// controllers = parseLib( "//dae:library_controllers/dae:controller", Controller, "controller" );
// animations = parseLib( "//dae:library_animations/dae:animation", Animation, "animation" );
// visualScenes = parseLib( ".//dae:library_visual_scenes/dae:visual_scene", VisualScene, "visual_scene" );
morphs = [];
skins = [];
daeScene = parseScene();
scene = new THREE.Object3D();
for ( var i = 0; i < daeScene.nodes.length; i ++ ) {
scene.add( createSceneGraph( daeScene.nodes[ i ] ) );
}
// unit conversion
scene.position.multiplyScalar(colladaUnit);
scene.scale.multiplyScalar(colladaUnit);
createAnimations();
var result = {
scene: scene,
morphs: morphs,
skins: skins,
animations: animData,
dae: {
images: images,
materials: materials,
cameras: cameras,
effects: effects,
geometries: geometries,
controllers: controllers,
animations: animations,
visualScenes: visualScenes,
scene: daeScene
}
};
if ( callBack ) {
callBack( result );
}
return result;
}
これが誰かを助けることを願っています! 楽しむ !:)