Я пытаюсь воссоздать atom с помощью THREE.js и сталкиваюсь с моей первой проблемой - поскольку каждый тип атома имеет разное количество протонов/нейтронов, я пытаюсь найти способ расположить их автоматически, чтобы не было столкновений, и, таким образом, конечный результат их всех вместе сделает что-то как можно ближе к сфере - см. это изображение для примера
(источник: alternativephysics.org)
,
Есть ли способ рассчитать это и легко назначить каждой позиции нейтронов/протонов с формулой? Или мне нужно задействовать физический движок, чтобы просто сжать сферы и надеяться на лучший результат с каждым прогоном?
У меня пока нет никакого кода, поскольку я просто пытаюсь понять, с чего начать эту часть.
EDIT
Я должен также отметить, что я хочу, чтобы сферы были сжаты вместе в пространстве большей сферы. Я НЕ пытаюсь заставить все сферы идти по радиусу большей сферы.
ОБНОВЛЕНИЕ 2
Я пытался использовать физический движок, чтобы раздавить их всех на небольшой площади, но я не могу найти движок, который позволил бы мне перемещать все объекты в моей сцене в положение (0,0,0) с гравитационной силой, Все двигатели просто притягивают гравитацию к объекту. Я все же предпочел бы использовать формулу для позиционирования сфер, а не включать весь физический движок в свой проект.
ОБНОВЛЕНИЕ 3, 04/06/06
Я немного поэкспериментировал, но все еще не могу сделать это правильно. Вот как это выглядит сейчас:
Но, как вы можете видеть, выглядит действительно не так. Вот что происходит, когда я делаю atom урана вместо атома углерода (больше протонов/нейтронов/электронов)
Это может быть только я, но это больше похоже на какой-то необычный рататуй, чем atom урана.
Как я сюда попал:
Я пытался сделать то, что искал выше, и вот предпосылка:
(particleObject
является родителем частицы, частица будет двигаться относительно этого объекта)
- Я добавил все длины протонов и нейтронов вместе, чтобы я мог перебрать их всех.
- Если
added number % 2 == 0
, (что это для моего тестирования), я бы установил поворот на(pi * 2) / 2
& lt; - последние два были там, чтобы представить два выше. - Каждая итерация
I
будет увеличивать переменнуюl
. (надеюсь) всякий раз, когдаi
будет равняться переменнойloopcount
, это будет означать, что я поместил сферу вокруг в форме сферы. Затем я умножилloopcount
на 3, чтобы узнать, сколько сферы понадобится для следующего запуска. Я бы установилl
на 0, чтобы позиционирование сферы было сброшено, а цикл увеличился бы, в результате чего следующий ряд сферы был бы размещен на 1 единицу по оси x.
(Извините за терминологию, это очень сложно объяснить. См. код.)
var PNamount = atomTypes[type].protons + atomTypes[type].neutrons;
var loopcount = 1;
if(PNamount % 2 == 0) {
var rotate = (PI * 2) / 2;
loopcount = 2;
}
var neutrons = 0,
protons = 0,
loop = 1,
l = 0;
for(var i = 0; i < PNamount; i++) {
if(i == loopcount){
loopcount = loopcount * 3;
loop++;
rotate = (PI * 2) / loopcount;
l = 0;
} else {
l++;
}
particleObject.rotation.x = rotate * l;
particleObject.rotation.y = rotate * l;
particleObject.rotation.z = rotate * l;
particle.position.x = loop;
}
Честно говоря, я не очень хорош в 3D математике. Так что любая помощь будет очень полезна. Плюс, вполне возможно, что мой метод их позиционирования абсолютно неверен во всех отношениях. Спасибо!
Вы можете увидеть код в прямом эфире здесь.