javascript - three.js 双视口(viewport)只有一个显示

标签 javascript html three.js

我试图在 http://stemkoski.github.io/Three.js/Viewports-Dual.html 上克隆 Lee Stemkoski 的双视口(viewport)优秀示例.

当使用 Firefox 23.0.1 从我的本地 PC Windows 7 上的 github 位置访问它时,它运行良好。 但是当我复制源代码并尝试从我的本地驱动器运行它时,它只会显示要渲染的第二个视口(viewport)。 如果我注释掉第二个视口(viewport)渲染的代码,那么它会显示第一个视口(viewport) OK。

可能是版本问题。我本可以从 GitHub 获得代码,但它似乎不在那里。 我通过 Firefox 的“另存为完整网页”获得了源代码。 为了协助调试,我通过逐步删除统计、控件、信息按钮等无关紧要的内容来最小化 javascript。

我的想法已经用完了,想知道是否有人能看出问题所在。 下面代码块的最后 11 行是操作所在的位置。

干杯。

============================================= ================================================ ========================

<!doctype html> // based on Three.js "tutorials by example" Author: Lee Stemkoski Date: June 2012 (three.js v49)
<html lang="en">
<head>
        <title> LIGER05 -- Three.js</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
    body 
    {
        font-family: Monospace;
        font-weight: bold;
        background-color: #ccccff;
        margin: 0px;
        overflow: hidden;
    }
</style> </head>
<body>
<!-- <div id="message"></div>-->
<script src="js/Three.js"></script>
<script src="js/Detector.js"></script>
<script src="js/Stats.js"></script>
<script src="js/THREEx.KeyboardState.js"></script>
<script src="js/THREEx.FullScreen.js"></script>
<script src="js/THREEx.WindowResize.js"></script>
<div id="ThreeJScontainer" style="position: absolute; left:0px; top:0px"></div><!-- Pre-defined Container for rendered can
<script>  // based on Three.js "tutorials by example" Author: Lee Stemkoski Date: June 2012 (three.js v49) -->
var container, scene, camera, camera2, renderer;
init();
animate();
// FUNCTIONS //
function init() {
scene = new THREE.Scene();
// CAMERA //
var SCREEN_WIDTH = window.innerWidth , SCREEN_HEIGHT = window.innerHeight;  
var VIEW_ANGLE = 45, ASPECT = (0.5*SCREEN_WIDTH) / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
camera  = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
camera2 = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
scene.add(camera);
scene.add(camera2);
camera.position.set(0,0,200);
camera2.position.set(0,250,0);
camera.lookAt(scene.position);  
camera2.lookAt(scene.position);     
// RENDERER NEW
if ( Detector.webgl )
    {renderer = new THREE.WebGLRenderer( {antialias:true} );}//alert("WebGL Renderer");         }
else
    {renderer = new THREE.CanvasRenderer();}//alert("Canvas Renderer");         }
renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
//...Either create a div element to contain the renderer        ==> container = document.createElement( 'div' );
container = document.getElementById( 'ThreeJScontainer' ); //...OR reference predefined container in the html
container.appendChild( renderer.domElement );
//Hmmmm   THREEx.WindowResize(renderer, camera);
var light = new THREE.PointLight(0xffffff);
    light.position.set(0,250,0);
    scene.add(light);
    //var ambientLight = new THREE.AmbientLight(0x111111);
    // scene.add(ambientLight);
var sphereGeometry = new THREE.SphereGeometry( 50, 32, 16 ); 
    // use a "lambert" material rather than "basic" for realistic lighting.//(don't forget to add >= 1 light!)
    var sphereMaterial = new THREE.MeshLambertMaterial( {color: 0x8888ff} ); 
    var sphere1 = new THREE.Mesh(sphereGeometry, sphereMaterial);
    sphere1.position.set(-60, 0, 50);
    scene.add(sphere1);  
    var sphere2 = new THREE.Mesh(sphereGeometry, sphereMaterial);
    sphere2.position.set(0, 0, -50);
    scene.add(sphere2);         
    var sphere3 = new THREE.Mesh(sphereGeometry, sphereMaterial);
    sphere3.position.set(60, 0, 50);
    scene.add(sphere3);                 
    }
function animate() {
    requestAnimationFrame( animate );
render();       
update();   }
function update() {
// delta = change in time since last call (in seconds)
var delta = clock.getDelta(); }
function render(){  
var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
camera.aspect = (0.5 * SCREEN_WIDTH) / SCREEN_HEIGHT;
camera.updateProjectionMatrix();
camera2.aspect = (0.5 * SCREEN_WIDTH) / SCREEN_HEIGHT;
camera2.updateProjectionMatrix();
var mar = 100
var panelX1min = mar
var panelWidth = Math.floor(0.5 * SCREEN_WIDTH) - (2* mar)
var panelX2min = mar + panelWidth + mar + mar
var panelYmin = mar
var panelHeight = SCREEN_HEIGHT - (2*mar)
//...LEFT SIDE 
renderer.setViewport( panelX1min, panelYmin, panelWidth , panelHeight  );
renderer.render( scene, camera );
//...RIGHT SIDE

    // ***** if you comment out the next two lines then the left side viewport will be shown *****

renderer.setViewport( panelX2min, panelYmin, panelWidth, panelHeight ); 
renderer.render( scene, camera2 );
}
</script></body></html>
=========================================================================================================================
=========================================================================================================================

最佳答案

需要以下语句(在 javascript init 函数中) 防止渲染器在渲染第一个视口(viewport)后清除其缓冲区:-

    renderer.autoClear = false

关于javascript - three.js 双视口(viewport)只有一个显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726693/

相关文章:

javascript - 退出弹出脚本

javascript - 如何使用选择和按钮创建指令

javascript - 在 jQuery 中每 5 秒调用一次函数的最简单方法是什么?

javascript - jQuery 动画函数的链接无法正常工作

javascript - three.js 使用轨道控件获取相机位置

javascript - 如何通过异步调用检索数据

html - HTML 解析期间范围发生变化

javascript - Bootstrap 5 Offcanvas - 检测 offcanvas 项目是否在加载时显示

javascript - ThreeJS 如何设置 OrbitControls 的位置

javascript - THREE.FontLoader() 在三个 JS 中不起作用