AFrame: как поместить THREE.LineBasicMaterial в Aframe

Я работаю над помещением LineBasicMaterial в AFrame, но наткнулся на некоторые проблемы:

1. Переменные каким-то образом вводятся в схему и не могут быть извлечены без ошибок.

У меня есть коробка:

<a-box material="shader: linebasic;"></a-box>

И зарегистрировали собственный шейдер:

AFRAME.registerShader('linebasic', {
    schema: {
        blending:       {default: THREE.NormalBlending},
        color:          {type: 'color', default: 0xffffff, is: 'uniform'},
        depthTest:      {default: true},
        depthFunc:      {default: THREE.LessEqualDepth},
        depthWrite:     {default: true},
        fog:            {default: false},
        linewidth:      {default: 10},
        linecap:        {default: 'round'},
        linejoin:       {default: 'round'},
        needsUpdate:    {default: true},
        opacity:        {default: 1},
        side:           {default: THREE.FrontSide},
        transparent:    {default: true},
        vertexColors:   {default: THREE.NoColors},
        visible:        {default: true}
    },
    init: function (data) {
        console.log(data);
        delete data.flatShading;
        this.material = new THREE.LineBasicMaterial(data);
        this.update(data);
    },
    update: function (data) {
        this.material.clone(data);
    }
});

Каким-то образом был установлен data.flatShading, хотя на объекте и шейдере его нет. Вот почему я delete data.flatShading.

Еще одно свойство, которое также присутствует в данных, - shader. Если я удалю его, консоль выдаст мне следующее сообщение об ошибке:

компоненты: материал: ошибка Неизвестная схема шейдера undefined + 0 мс

Если я оставлю его, я получаю уведомление:

THREE.LineBasicMaterial: шейдер не является свойством этого материала.

Так или иначе, что-то явно не так.

ОБНОВЛЕНИЕ №1:

Следующие исправления # 1, опубликованные @ngokevin:

AFRAME.registerShader('linebasic', {
    schema: {
        blending:       {default: THREE.NormalBlending},
        color:          {type: 'color', default: 0xffffff, is: 'uniform'},
        depthTest:      {default: true},
        depthFunc:      {default: THREE.LessEqualDepth},
        depthWrite:     {default: true},
        fog:            {default: false},
        linewidth:      {default: 10},
        linecap:        {default: 'round'},
        linejoin:       {default: 'round'},
        needsUpdate:    {default: true},
        opacity:        {default: 1},
        side:           {default: THREE.FrontSide},
        transparent:    {default: true},
        vertexColors:   {default: THREE.NoColors},
        visible:        {default: true}
    },
    init: function (data) {
        data = AFRAME.utils.extend({}, data);
        delete data.flatShading;
        delete data.shader;
        this.material = new THREE.LineBasicMaterial(data);
        this.update(data);
    },
    update: function (data) {
        this.material.clone(data);
    }
});

2. LineBasicMaterial отображается как сплошной белый блок.

Несмотря на то, что я использую THREE.LineBasicMaterial со всеми его свойствами и множеством свойств THREE.Material, материал отображается не в виде линий, а в виде сплошного блока.

Материал и LineBasicMaterial не имеют «каркаса», поэтому я не знаю, как сделать это, не добавляя каркасный элемент и не «взламывая» LineBasicMaterial.

Номер 2 для меня сейчас наиболее важен, но я также хотел бы исправить 1. Я думаю, что они связаны, поэтому я задаю им один вопрос.


person xaddict    schedule 06.10.2016    source источник
comment
можно просто добавить каркас и он будет работать?   -  person ngokevin    schedule 07.10.2016
comment
Неа. он дает мне следующее: three.js:20406THREE.LineBasicMaterial: 'wireframe' is not a property of this material. Итак, я предполагаю, что LineBasicMaterial не использует каркасный, а ЯВЛЯЕТСЯ каркасным шейдером.   -  person xaddict    schedule 07.10.2016
comment
У вас ширина линии 10, это кажется довольно толстым?   -  person ngokevin    schedule 07.10.2016
comment
Пробовал 0, 1 ... 10. Ничего не происходит   -  person xaddict    schedule 07.10.2016
comment
Может ли быть, что AFRAME.registerShader является оболочкой для ShaderMaterial вместо RawShaderMaterial и каким-то образом запрещает использование фактических шейдеров THREE.js?   -  person xaddict    schedule 07.10.2016
comment
А если у вас есть свободное время: xaddict.me/vr   -  person xaddict    schedule 08.10.2016
comment
registerShader имеет ярлык для ShaderMaterial с vertexShader / fragmentShader ... но он не используется, если вы просто используете LineBasicMaterial. Также LineBasicMaterial предназначен для использования с THREE.Line, может быть, вам придется с этим поработать?   -  person ngokevin    schedule 11.10.2016
comment
Правильно!!!! это наверное все. Вероятно, он показывает результаты только в строках   -  person xaddict    schedule 11.10.2016


Ответы (1)


Для №1, поскольку он в настоящее время передает прямой доступ к объекту data, вы не должны удалять его, а вместо этого клонируйте его, а затем удалите. В файле есть проблема просто выполнить this.data, а не получать его как функцию.

data = AFRAME.utils.extend({}, data);
person ngokevin    schedule 06.10.2016
comment
Это исправлено # 1. Я обновлю код. # 2 все еще не работает. - person xaddict; 07.10.2016