|
@@ -215,25 +215,26 @@ Renderer.### <a href="">setViewport</a> ( x : Integer, y : Integer, width : Inte
|
|
<pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
|
|
<pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
|
|
+scene.background = new THREE.Color('red');
|
|
+scene.background = new THREE.Color('red');
|
|
</pre>
|
|
</pre>
|
|
-<p>此时,我们快速滚动屏幕,就会发现这个问题。屏幕滚动时的动画放慢十倍后的效果如下:</p>
|
|
|
|
|
|
+<p>此时,我们<a href="../examples/multiple-scenes-v2.html" target="_blank">快速滚动屏幕</a>,就会发现这个问题。屏幕滚动时的动画放慢十倍后的效果如下:</p>
|
|
<div class="threejs_center"><img class="border" src="../resources/images/multi-view-skew.gif"></div>
|
|
<div class="threejs_center"><img class="border" src="../resources/images/multi-view-skew.gif"></div>
|
|
<p>为了解决这个问题,先将<code class="notranslate" translate="no">Canvas</code>的定位方式由<code class="notranslate" translate="no">position: fixed</code> 改为<code class="notranslate" translate="no">position: absolute</code>。</p>
|
|
<p>为了解决这个问题,先将<code class="notranslate" translate="no">Canvas</code>的定位方式由<code class="notranslate" translate="no">position: fixed</code> 改为<code class="notranslate" translate="no">position: absolute</code>。</p>
|
|
<pre class="prettyprint showlinemods notranslate lang-css" translate="no">#c {
|
|
<pre class="prettyprint showlinemods notranslate lang-css" translate="no">#c {
|
|
- position: fixed;
|
|
- position: fixed;
|
|
+ position: absolute;
|
|
+ position: absolute;
|
|
</pre>
|
|
</pre>
|
|
-<p>为了解决这个问题,先将<code class="notranslate" translate="no">Canvas</code>的定位方式由<code class="notranslate" translate="no">position: fixed</code> 改为<code class="notranslate" translate="no">position: absolute</code>。</p>
|
|
|
|
|
|
+</pre>
|
|
|
|
+<p>然后,我们将设置<code class="notranslate" translate="no">Canvas</code>的<code class="notranslate" translate="no">transform</code>来移动它,使画布的顶部位于页面当前滚动到的任何部分的顶部。</p>
|
|
<pre class="prettyprint showlinemods notranslate lang-js" translate="no">function render(time) {
|
|
<pre class="prettyprint showlinemods notranslate lang-js" translate="no">function render(time) {
|
|
...
|
|
...
|
|
|
|
|
|
const transform = `translateY(${window.scrollY}px)`;
|
|
const transform = `translateY(${window.scrollY}px)`;
|
|
renderer.domElement.style.transform = transform;
|
|
renderer.domElement.style.transform = transform;
|
|
</pre>
|
|
</pre>
|
|
-<p><code class="notranslate" translate="no">position: fixed</code> 会完全禁用画布的滚动,无论其他元素是否已经滚动到它的上;
|
|
|
|
|
|
+<p><code class="notranslate" translate="no">position: fixed</code> 会完全禁用画布的滚动,无论其他元素是否已经滚动经过它;
|
|
<code class="notranslate" translate="no">position: absolute</code>则会保持画布与页面的其余部分一起滚动,这意味着我们绘制的任何东西都会与页面一起滚动,就算还未完全渲染出来。当场景完成渲染之后,然后移动画布,场景会与页面被滚动后的位置相匹配,并重新渲染,这就意味着,只有窗口的边缘会显示出一些还未被渲染的数据,当时页面中的场景不会出现这种现象。下面时利用以上方法后的效果(动画同样放慢了10倍)。</p>
|
|
<code class="notranslate" translate="no">position: absolute</code>则会保持画布与页面的其余部分一起滚动,这意味着我们绘制的任何东西都会与页面一起滚动,就算还未完全渲染出来。当场景完成渲染之后,然后移动画布,场景会与页面被滚动后的位置相匹配,并重新渲染,这就意味着,只有窗口的边缘会显示出一些还未被渲染的数据,当时页面中的场景不会出现这种现象。下面时利用以上方法后的效果(动画同样放慢了10倍)。</p>
|
|
<h2 id="-">让它更加通用</h2>
|
|
<h2 id="-">让它更加通用</h2>
|
|
<p>现在,我们已经实现了在一个<code class="notranslate" translate="no">Canvas</code>中渲染多个场景的功能,接下来就来处理一下让它更加好用些。</p>
|
|
<p>现在,我们已经实现了在一个<code class="notranslate" translate="no">Canvas</code>中渲染多个场景的功能,接下来就来处理一下让它更加好用些。</p>
|
|
-<p>我们可以封装一个主渲染函数用来管理整个<code class="notranslate" translate="no">Canvas</code>,并定义一个场景元素列表和他们对应的场景初始化函数。对于每个元素,它将检查该元素是否滚动到了可视区域并调用相应的场景初始化函数。这样我们就构建了一个渲染系统,在这个系统中每个独立的<code class="notranslate" translate="no">scenes</code>都会在它们各自定义的空间内独立渲染且不互相影响。</p>
|
|
|
|
|
|
+<p>我们可以封装一个主渲染函数用来管理整个<code class="notranslate" translate="no">Canvas</code>,并定义一个场景元素列表和他们对应的场景初始化函数。对于每个元素,它将检查该元素是否滚动到了可视区域并调用相应的场景初始化函数。这样我们就构建了一个渲染系统,在这个系统中每个独立的<code class="notranslate" translate="no">scenes</code>都会在它们各自定义的空间内独立渲染且不互相影响。</p>
|
|
<p>主渲染函数如下:</p>
|
|
<p>主渲染函数如下:</p>
|
|
<pre class="prettyprint showlinemods notranslate lang-js" translate="no">const sceneElements = [];
|
|
<pre class="prettyprint showlinemods notranslate lang-js" translate="no">const sceneElements = [];
|
|
function addScene(elem, fn) {
|
|
function addScene(elem, fn) {
|