在Three.js的中心旋转mergeometry对象

用户名

我正在努力寻找一种方法来旋转对象的中心。目前,我可以旋转场景,但是当我旋转时,对象会远离用户。我在论坛的同一行中调查了一些已经问过的问题,但无法使其正常工作。以下是我正在使用/ attached的html / three.js文件的一部分,您将找到完整的工作示例。非常感谢您的帮助

            <script src="../build/three.min.js"></script>
            <script src="js/controls/TrackballControls.js"></script>
            <script src="js/libs/stats.min.js"></script>

            <script>

                    var container, stats;
                    var camera, controls, scene, renderer;
                    var pickingData = [], pickingTexture, pickingScene;
                    var objects = [];
                    var highlightBox;
                    var splitCoord;
                    var avStdProp;

                    var mouse = new THREE.Vector2();
                    var offset = new THREE.Vector3( 10, 10, 10 );

                    var geom = new THREE.BoxGeometry(0.005, 0.005, 0.005 );
                            geom.colorsNeedUpdate = true;

                    init();
                    animate();

                    function init() {

                            container = document.getElementById( "container" );

                            camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 10000 );

                            camera.position.x=250;
                            camera.position.y=300;
                            camera.position.z=400;

                            renderer = new THREE.WebGLRenderer( { antialias: true } );
                            controls = new THREE.TrackballControls(camera);
                            controls.rotateSpeed = 1.0;
                            controls.zoomSpeed = 4;
                            controls.panSpeed = 0.8;
                            controls.noZoom = false;
                            controls.noPan = false;
                            controls.staticMoving = true;
                            controls.dynamicDampingFactor = 0.3;

                            scene = new THREE.Scene();


                            pickingScene = new THREE.Scene();
                            pickingTexture = new THREE.WebGLRenderTarget(800, 800);
                            pickingTexture.minFilter = THREE.LinearFilter;
                            pickingTexture.generateMipmaps = false;

                            scene.add( new THREE.AmbientLight( 0x555555 ) );

                            var light = new THREE.SpotLight( 0xffffff, 1.5 );
                            light.position.set( 0, 500, 2000 );
                            scene.add( light );

                            var geometry = new THREE.Geometry(),
                            pickingGeometry = new THREE.Geometry(),
                            pickingMaterial = new  THREE.MeshBasicMaterial( { vertexColors: THREE.VertexColors } ),
                            defaultMaterial = new THREE.MeshLambertMaterial({ color: 0xffffff, shading: THREE.FlatShading, vertexColors: THREE.VertexColors } );

                            function applyVertexColors( g, c ) {

                                    g.faces.forEach( function( f ) {

                                            var n = ( f instanceof THREE.Face3 ) ? 3 : 4;

                                            for( var j = 0; j < n; j ++ ) {

                                                    f.vertexColors[ j ] = c;

                                            }

                                    } );

                            }

                            var color = new THREE.Color();

                            var matrix = new THREE.Matrix4();
                            var quaternion = new THREE.Quaternion();

                            var coord="219_163_189;130_173_179;161_113_231;92_103_176;169_193_180;161_165_187;262_163_166;198_143_155;161_189_155;125_121_107";
                            splitCoord=coord.split(";");
                            var coordColr="0_255_255;255_255_0;0_0_255;0_255_0;255_255_0;0_255_0;0_0_255;0_255_255;255_255_0;210_210_45";
                            var splitCoordColor=coordColr.split(";");
                            var avgStd="1_0;3_0;0_0;2_0;3_0;2_0;0_0;1_0;3_0;3_0.35";
                            avStdProp=avgStd.split(";");

                            for ( var i = 0; i < splitCoord.length; i++ ) {

                                    var position = new THREE.Vector3();
                                    var xyz=splitCoord[i].split("_");
                                    var col=splitCoordColor[i].split("_");

                                    position.x = xyz[0];
                                    position.y = xyz[1];
                                    position.z = xyz[2];

                                    var rotation = new THREE.Euler();
                                    rotation.x = 0
                                    rotation.y = 0;
                                    rotation.z = 0;

                                    var scale = new THREE.Vector3();
                                    scale.x = 200 + 100;
                                    scale.y = 200 + 100;
                                    scale.z = 200 + 100;

                                    quaternion.setFromEuler( rotation, false );
                                    matrix.compose( position, quaternion, scale );

                                     // give the geom's vertices a random color, to be displayed

                                    col[0]=col[0]/255;
                                    col[1]=col[1]/255;
                                    col[2]=col[2]/255;

                                    applyVertexColors(geom, color.setRGB(col[0], col[1], col[2]));

                                    geometry.merge( geom, matrix );

                                    // give the geom's vertices a color corresponding to the "id"

                                    applyVertexColors( geom, color.setHex( i ) );

                                    pickingGeometry.merge( geom, matrix );

                                    pickingData[ i ] = {

                                            position: position,
                                            rotation: rotation,
                                            scale: scale

                                    };

                            }

                            var drawnObject = new THREE.Mesh( geometry, defaultMaterial );
                            scene.add( drawnObject );

                            pickingScene.add( new THREE.Mesh( pickingGeometry, pickingMaterial ) );

                            highlightBox = new THREE.Mesh(
                                    new THREE.BoxGeometry( 0.009, 0.009, 0.009 ),
                                    new THREE.MeshLambertMaterial( { color: 0xffffff }
                            ) );
                            scene.add( highlightBox );


                            //renderer.setClearColor( 0xffffff );
                            renderer.setPixelRatio( window.devicePixelRatio );
                            renderer.setSize(800,800);
                            renderer.sortObjects = false;

                             container.appendChild( renderer.domElement );
                            renderer.domElement.addEventListener( 'mousemove', onMouseMove );

                    }

                    //

                    function onMouseMove( e ) {

                            mouse.x = e.clientX;
                            mouse.y = e.clientY;

                    }

                    function pick() {
                    //render the picking scene off-screen
                    renderer.render( pickingScene, camera, pickingTexture );

                    //create buffer for reading single pixel
                    var pixelBuffer = new Uint8Array( 4 );

                    //read the pixel under the mouse from the texture
                    renderer.readRenderTargetPixels(pickingTexture, mouse.x+window.pageXOffset, pickingTexture.height - (mouse.y+window.pageYOffset), 1, 1, pixelBuffer);

                    //interpret the pixel as an ID
                    var id = ( pixelBuffer[0] << 16 ) | ( pixelBuffer[1] << 8 ) | ( pixelBuffer[2]);
                    var data = pickingData[ id ];

                    if (data) {

                    //move our highlightBox so that it surrounds the picked object
                    if (data.position && data.rotation && data.scale && controls.enabled){

                     highlightBox.position.copy( data.position );
                     highlightBox.rotation.copy( data.rotation );
                     highlightBox.scale.copy( data.scale ).add( offset );
                     highlightBox.visible = true;
                     }
                     }

                     else {
                                    highlightBox.visible = false;
                            }
                     }

                    function animate() {

                            requestAnimationFrame( animate );
                            render();
                            //stats.update();

                    }

                     function render() {
                            controls.update();
                            pick();
                            renderer.render(scene, camera);
                    }

有什么帮助吗?

福克·蒂尔

您可以将对象的几何形状设置为居中,因此网格的中心将位于位置(0,0,0),并且在旋转时不会“移开”。

像这样做:

geometry.center();
var drawnObject = new THREE.Mesh( geometry, defaultMaterial );
scene.add( drawnObject );

更新

因为您想通过将几何坐标保存到数组中来以一种不寻常的方式使用拾取,所以将几何居中对您没有帮助。您的问题是“在其中心旋转合并几何对象”,但似乎您想围绕几何中心旋转摄影机。

计算几何的边界球并将控件目标设置为其位置:

drawnObject.geometry.computeBoundingSphere();
controls.target = drawnObject.geometry.boundingSphere.center;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Three.js对象的“中心”是什么?

来自分类Dev

three.js旋转面向对象

来自分类Dev

在three.js中旋转对象

来自分类Dev

当对象旋转时Three.js旋转相机

来自分类Dev

Three.js旋转

来自分类Dev

围绕对象轴THREE.js旋转对象

来自分类Dev

使用Three.js,WebGL显示对象的顶点并旋转对象

来自分类Dev

使用Three.js,WebGL显示对象的顶点并旋转对象

来自分类Dev

THREE.js TrackballControls如何更改旋转中心不在画布中心?

来自分类Dev

将镜头对准Three.js中对象的中心

来自分类Dev

对象在拖动时以光标为中心(EventsControls + three.js)

来自分类Dev

three.js通过轴方向旋转对象

来自分类Dev

three.js通过鼠标向下旋转对象并移动

来自分类Dev

Three.js:添加和删除旋转对象的子代

来自分类Dev

Three.JS通过移动设备围绕对象旋转相机

来自分类Dev

Three.js通过圆路径旋转对象

来自分类Dev

Three.js:添加和删除旋转对象的子代

来自分类Dev

Three.js-围绕特定轴旋转对象

来自分类Dev

如何在Three.js中使用鼠标旋转对象?

来自分类Dev

Three.js 对象返回错误的位置/旋转/缩放值

来自分类Dev

THREE.js中有什么方法可以旋转后获取圆柱的顶部中心吗?

来自分类Dev

three.js:结合tween.js绕世界轴旋转对象

来自分类Dev

Three.js | OrbitControls | 如何换中心?

来自分类Dev

Three.js获得场景的中心

来自分类Dev

获取面部旋转Three.js

来自分类Dev

three.js中旋转或惯用的方向

来自分类Dev

Three.js相机旋转错误

来自分类Dev

加载文件的THREE.js旋转

来自分类Dev

Three.js旋转和定位几何