ホーム » 3D (ページ 3)
「3D」カテゴリーアーカイブ
threejs requestAnimationFrame
使い方が間違ってた?
function three_start() {
init() ;
loop() ;
}
function loop() {
controls.update();
renderer.clear();
renderer.render( scene, camera );
requestAnimationFrame( loop );
}
正しくは loader / babylon
function init() {
// …
animate() ;
// …
}
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
controls.update();
renderer.render( scene, camera );
}
この方法でも,環境により CPU リソースが食われる.
一先ずここまで.
本当は,完全にロードが終わったタイミングが取れれば良いのだが…
threejs OrbitControls
以前(r58)調べた時,動作が変だったが…
var controls = new THREE.OrbitControls( Camera, Renderer.domElement );
controls.addEventListener( ‘change’, ThreeRender );
controls.target.set(w/2,d/2,h/4) ;
controls.update();
r84 では意図した動作になっている.
他にも幾つか動作を見直し中.
three.js OBJMTLLoader
以前調べた時と OBJMTLLoader の扱いが異なっているので,
サンプルの該当部分を抽出.
r58
var loader = new THREE.OBJMTLLoader();
loader.addEventListener( ‘load’, function ( event ) {
var object = event.content;
object.position.y = – 80;
scene.add( object );
});
loader.load( ‘obj/male02/male02.obj’, ‘obj/male02/male02_dds.mtl’ );
r66
var loader = new THREE.OBJMTLLoader();
loader.load( ‘obj/male02/male02.obj’, ‘obj/male02/male02_dds.mtl’, function ( object ) {
object.position.y = – 80;
scene.add( object );
} );
r84
var onProgress = function ( xhr ) {
if ( xhr.lengthComputable ) {
var percentComplete = xhr.loaded / xhr.total * 100;
console.log( Math.round(percentComplete, 2) + ‘% downloaded’ );
}
};
var onError = function ( xhr ) { };
THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );
var mtlLoader = new THREE.MTLLoader();
mtlLoader.setPath( ‘obj/male02/’ );
mtlLoader.load( ‘male02_dds.mtl’, function( materials ) {
materials.preload();
var objLoader = new THREE.OBJLoader();
objLoader.setMaterials( materials );
objLoader.setPath( ‘obj/male02/’ );
objLoader.load( ‘male02.obj’, function ( object ) {
object.position.y = – 95;
scene.add( object );
}, onProgress, onError );
});
r74 から変更されていて,OBJMTLLoader が削除されたらしい.
https://github.com/mrdoob/three.js/releases?after=r75
Improved OBJLoader and MTLLoader and made OBJMTLLoader obsolete.
それで参考にさせてもらったのがここ.
http://stackoverflow.com/questions/35380403/how-to-use-objloader-and-mtlloader-in-three-js-r74-and-later
他にも,OBJLoader のデータのチェックが厳しくなったみたいで,
r84 OBJLoader.js 632 行目で
throw new Error( "Unexpected line: '" + line + "'" );
クラスによっては前からみたいだが,position が readonly .
position のメンバに対して代入すれば OK .
2023/08
https://dev.mish.work/wordpress/category/webgl/
https://itl.mish.work/_lib/js/i_lib/threejs/r131/c_3js_10.js
SceneJS
Cube.imo (0,0,0)-(1000,1000,1000) のデータに対して,
translate X:-500 , y:-500 , z:500
spinYaw で,回転.spinPitch は上下方向.
yaw , pitch で最初の位置(角度で単位は度?).
zoom が中心までの相対位置?
zoomSensitivity は拡大率.
yaw : 30 ,
pitch : -10 ,
zoom : 2500,
zoomSensitivity : 100 ,
spinYaw : 0.3 ,
cube_imo.html
yaw : 90 で右から.180 で後ろから.
pitch : -20 としているので,
translate の y は中心でなく高さの 30% の位置にしている.
どうも材質の指定(obj の mtl など)は,効いてないみたい.
script 内の type:”texture” , src: … で指定する?
Win 10 10586 3D Builder
3MF 形式ではいたデータが,10586 にしてから開けないでいた.エラー : 0x80004005
model タグに,xmlns 属性が必要になった?
<model unit= "millimeter " xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02 " >
ply だと,
3MF でのテクスチャは未だ.
2016/05/02 テクスチャなどの大文字,小文字も区別される?また,path も / から正しく指定する必要がある.
テクスチャの場合,colorid の指定が object の属性では効果がなくなった?
triangle 内での指定が必要?
3MF
AMF texture
AMF を調べていて,テクスチャ部分の変換テスト.
次の様なコードで,それぞれの色の成分の画像が出来ることを確認.
inline AMF_Texture AMF_texture_To (const Xml_E& tex_e)
{
AMF_Texture tex ;
if (tex_e.GetName() != AMF_texture) { return tex ; }
tex.ID = tex_e.GetAttribute(AMF_id) ;
tex.Width = ::ttou4 ( tex_e.GetAttribute(AMF_width)) ;
tex.Height = ::ttou4 ( tex_e.GetAttribute(AMF_height)) ;
tex.Texture = ::base64_decode(::To_v_char(tex_e.GetText())) ;
{
i_DIB dib ;
dib.Create(tex.Width,tex.Height) ;
for ( long y=0 ; y<dib.GetHeight() ; y++) {
for (long x=0 ; x<dib.GetWidth () ; x++) {
u_32 pc = *(dib.GetP_Pixel(x,y)) ;
u_32 argb = pc ;
if (unsigned(x+y*dib.GetWidth()) < tex.Texture.size()) {
u__8 c = tex.Texture[x+y*dib.GetWidth()] ;
argb = 0xff000000 + (c<<16) + (c<<8) + (c) ;
}
u_32* bits = (u_32*)dib.GetP_Bits() ;
*(bits+(x+y*dib.GetWidth())) = argb ;
}
}
tstring dibName ;
{
// …
dibName = outPath + _T("\\") + tex.ID + _T("_") + ::To_tstring(Count) + _T(".dib") ;
}
::HBITMAP_To(::ToHBITMAP(dib),dibName.c_str()) ;
}
return tex ;
}
1.5 M 位の bmp をテクスチャとして求め,それを数100個?生成していて,メモリ不足.
原因はすぐわかったが,この上のコードでもある様に ToHBITMAP() で求めた HBITMAP を DeleteObject してない.
次の様にする必要がある.
HBITMAP hBMP = ::ToHBITMAP(dib) ;
::HBITMAP_To(hBMP,dibName.c_str()) ;
::DeleteObject(hBMP) ;
幸いこの関係のコードを書いたのが今年になってからだったので,利用している部分は限定的.
検索をかけて変更が必要な所は 10 箇所程度?
多くは,デバッグ版でのみ実行されるコード.
AMF_Texture のデータメンバを protected に.
v_char AMF_Texture::GetTexture() を用意して,それを利用する様に変更すると,デバッグ版で遅い.
ここでの対応はすぐわかったが,この類のコードが相当ありそう.
参照の関係の理解が不十分なので,もう少し調べる必要あり.
頂点法線の計算
今まで GL_FLAT で処理していたので面の法線を利用していた.
そのため,既に法線の情報が設定されたデータでうまく表示できてないものがあった.
glShadeModel(GL_SMOOTH) として,頂点に対して法線を設定することによりそれなりに表示する様にはなった.
これらのデータの様に,頂点の法線を求める必要が出てきた.
ここ(スムージング角度)を参考にさせてもらい,何とかそれなりに表示できる様になった.