2017-02-10 4 views
1

Итак, я хочу создать поле 2D-потока в файле three.js из рабочего примера в p5.js. Это оригинальный исходный код:Создать вектор3 с определенным заголовком

var inc = 0.1; //Increment of noise 
var yoff = 0; 
var scl = var; //Scale of noise field 
var cols = rows = 10; 

for(var y = 0; y < rows; y++) 
{ 
    var xoff = 0; 
    for(var x = 0; x < cols; x++) 
    { 
     var index = x + y * cols; 
     var angle = noise(xoff, yoff) * TWO_PI; //Create angle with Perlin noise 
     var v = p5.Vector.fromAngle(angle); //Create new vector from angle 
     v.setMag(0.1); //set magnitude of vector 
     flowfield[index] = v; 
     xoff += inc; 
     stroke(0, 50); 
     strokeWeight(1); 
     push(); 
     translate(x * scl, y * scl); 
     rotate(v.heading()); 
     line(0, 0, scl, 0); 
     pop(); 
    } 
    yoff += inc; 
} 

Теперь я хочу повторить функцию p5.Vector.fromAngle() в three.js.

Насколько я понимаю, мне нужно создать вектор, а затем повернуть вектор вокруг оси z, используя .applyQuaternion (quaternion). Однако я вращаю вектор вокруг центра и не изменяю его заголовок.

var vector = new THREE.Vector3(100, 100, 0); 

var angle = Math.random() * Math.PI * 2; 
var quaternion = new THREE.Quaternion(); 
quaternion.setFromAxisAngle(new THREE.Vector3(0, 0, 1), Math.PI/2); 

vector.applyQuaternion(quaternion); 
+0

Я не уверен, что понял вас правильно, извинения, если нет. Вектор можно рассматривать как указатель от центра («происхождение») до определенной точки в 3D-пространстве. Таким образом, единственный способ поворота вектора - это происхождение. Это может помочь, если вы добавите какое-то объяснение, что вы пытаетесь сделать, каково ожидаемое поведение и что вы получаете вместо этого. –

+0

Несомненно, я добавлю его к исходному вопросу. – IIMaxII

ответ

2

Если вы просто хотите использовать х/у-плоскость, функция будет в основном выглядеть следующим образом:

function fromAngle(angle) { 
    return new THREE.Vector3(
    Math.cos(angle), Math.sin(angle), 0 
); 
} 

Я считаю, что это намного проще, чем использование кватернионов для этого. Если вам нужны более сложные трехмерные вращения, кватернионы имеют большой смысл. Это также точно what p5.js does.

Эта функция возвращает единичный вектор (вектор с длиной 1), указывающий в данном направлении (так fromAngle(0) === [1, 0, 0], fromAngle(Math.PI/2) === [0, 1, 0] и т. Д.).

+0

Спасибо большое! Работает отлично. – IIMaxII

+0

Кватернионы были бы чересчур избытком для этого: D – pailhead

Смежные вопросы