1

我仍在尝试用 3 个视图可视化一个场景(一个完全交互,一个从右侧仅缩放,一个从顶部仅缩放,请参见此处:更改交互器的“配置”属性以禁用某些用户事件)。

用户事件的处理是好的。我尝试了在 3 个渲染器中加载对象的 2 个选项:愚蠢的一个和第 07 课的一个。注释代码对于查看问题是可选的(它是从右侧或顶部仅通过缩放查看)。

选项 1:第 7 课

var run = function() {

var r1 = new X.renderer('r1');
r1.init();

var r2 = new X.renderer('r2');
r2.init();
r2.interactor().config.MOUSECLICKS_ENABLED = false;
r2.interactor().config.KEYBOARD_ENABLED = false;
r2.interactor().config.HOVERING_ENABLED = false;
r2.interactor().config.CONTEXTMENU_ENABLED = false;
r2.interactor().init();

var r3 = new X.renderer('r3');
r3.init();
//r3.interactor().config.MOUSECLICKS_ENABLED = false;
//r3.interactor().config.KEYBOARD_ENABLED = false;
//r3.interactor().config.HOVERING_ENABLED = false;
//r3.interactor().config.CONTEXTMENU_ENABLED = false;
//r3.interactor().init();

var objet= new X.object(); //typo corrected
objet.load('monobjet.stl');
r1.add(objet);

r1.onShowtime = function() {
    r2.add(objet);
    r3.add(objet);
    //r2.camera().setPosition(100,0,0);
    //r3.camera().setPosition(0,100,0);     
    r2.render();
    r3.render();
};  
r1.render();

选项2:愚蠢

var run = function() {

var r1 = new X.renderer('r1');
r1.init();

var r2 = new X.renderer('r2');
r2.init();
r2.interactor().config.MOUSECLICKS_ENABLED = false;
r2.interactor().config.KEYBOARD_ENABLED = false;
r2.interactor().config.HOVERING_ENABLED = false;
r2.interactor().config.CONTEXTMENU_ENABLED = false;
r2.interactor().init();

var r3 = new X.renderer('r3');
r3.init();
//r3.interactor().config.MOUSECLICKS_ENABLED = false;
//r3.interactor().config.KEYBOARD_ENABLED = false;
//r3.interactor().config.HOVERING_ENABLED = false;
//r3.interactor().config.CONTEXTMENU_ENABLED = false;
//r3.interactor().init();

var objet= new X.object(); //typo corrected
objet.load('monobjet.stl');
r1.add(objet);
r2.add(objet);
r3.add(objet);
//r2.camera().setPosition(100,0,0);
//r3.camera().setPosition(0,100,0);
r1.render();        
r2.render();
r3.render();
};

愚蠢的选项为 r2 和 r3 提供黑屏,第 07 课中的一个在 3 个渲染器中提供了我的对象,但它已在 r2 和 r3 中移动(如果您评论 setPosition() 或查看,您也会在第 7 课中看到它精心)。此外,如果我使用鼠标旋转视图,我看到我的对象不在 r2 中以 0 为中心,但不在 r2 或 r3 中。

所以我的问题是: r1.render() 是否改变了我的“对象”的缓冲区?是预期的吗?我在 Stack Overflow 和 Github 上查看过类似的问题,但什么也没看到。

除了看到更好(通过 var object2 = new X.cube(...))之外,我还尝试了 X.cube,它是一样的。


我想我发现了 1 次测试的问题:当我在将 object.points().setClean() 添加到第一个渲染器之前添加它时,它不像其他对象那样以对象为中心。

因此,我们认为问题如下:当您第一次添加从文件加载的对象时,它的“点”是脏的,而在接下来的时间里它们是干净的。所以问题来自“points.setClean();” 在重新计算 vertexBuffer 的块中的 renderer.update_() 中没有?这正常吗?

如果我很好理解: - 第一个渲染器看到点是脏的,因此计算一个新的边界框以将对象放在视图的中心,然后当他看到对象是新的时,他计算一个新的 vertexBuffer 并清理对象.points 属性。- 其他渲染器看到这些点不再脏所以他们不计算边界框,但他们看到对象是新的所以他们计算缓冲区。

有什么解决办法?我必须更改 renderer.update_() 中的“if (points.dirty() || transform.dirty())”,或者为以下渲染器设置为 true ^^

4

1 回答 1

0
var machoire = new X.object();
objet.load('monobjet.stl');
r1.add(objet);
r2.add(objet);
r3.add(objet);

这只是一个错字吗?应该

var objet = new X.object();
objet.load('monobjet.stl');

我认为上面的版本 1 应该可以工作。

于 2012-04-30T16:12:46.320 回答