저는 Three.js에서 입자 구름의 예를 연구하고 놀았습니다. 대부분은 모양 필드를 사용하여 입자 필드를 정의하거나 필드 전체에 무작위로 분포시키는 매개 변수를 사용합니다. 내가하고 싶은 것은 각 입자가 보이지 않는 벡터 경로에 상대적으로 근접한 입자 구름을 만드는 것입니다. 예를 들어, 가벼운 곡선 벡터 경로를 정의하면 모든 입자가 보이지 않는 방향을 따라 일정한 반지름 내에서 떠 다니고 끝까지 가늘어지면서 핫도그 모양의 입자 구름이 형성 될 수 있습니다. 따라서 입자를 만드는 방법을 알고 벡터 경로를 만드는 방법을 알고 있습니다. 어떻게이 두 가지를 서로 연결합니까? 감사!Three.js를 사용하여 벡터 경로를 기준으로 입자 구름을 정의하는 방법은 무엇입니까?
0
A
답변
2
두 점을 사용하여 경로를 정의 할 수 있습니다. 이 점을 p
및 q
으로하고 v = p - q
으로합시다. 경로에 누워있는 점은 M
일부 0 <= lambda <= 1
의 벡터 방정식
M = (1 - lambda) * p + lambda * q
을 충족해야합니다. 경우들이 주위 일주되도록 약간 작은 반경의 계산 된 좌표를 수정할
// p and q are instances of THREE.Vector3
function pointOnPath(p, q) {
var lambda = Math.random();
var scaledp = (new THREE.Vector3()).copy(p).multiplyScalar(1 - lambda);
var scaleq = (new THREE.Vector3()).copy(q).multiplyScalar(lambda);
var result = (new THREE.Vector3()).addVectors(scaledp, scaledq);
return result;
}
다음 : 따라서,는 랜덤 lambda
생성 위의 식의 값을 이용하여 상기 경로상의 임의의 포인트를 생성 할 수있다 경로. 작은 벡터 오프셋을 추가하면됩니다. 그러면 어떻게 그 벡터를 계산할 수 있을까요?
이후 벡터는 p
에서 q
까지의 선에 수직 인 평면에 있습니다. 위의 조건을 만족하는 무한 수의 벡터가 있으며 그 중 두 개는 e1 = (v.y, -v.x, 0)
과 e2 = (v.z, 0, -v.x)
입니다. lambda * e1 + mu * e2
형식의 벡터는 v
에 수직이됩니다. 따라서 lambda
및 mu
만 생성하면 모든 것이 준비됩니다.
참고 : lambda
및 mu
은 [-1; 1]가 아니라 [0; 1]. offset
벡터를 정규화하기 때문에 간격 [-0.5; 0.5]는 정규화가 [-1; 1]
function getVectorOffset(p, q, radius) {
var v = (new THREE.Vector3()).subVectors(q, p);
v.normalize();
var e1 = new THREE.Vector3(v.y, -v.x, 0),
e2 = new THREE.Vector3(v.z, 0, -v.x);
e1.normalize();
e2.normalize();
var lambda = Math.random() - 0.5,
mu = Math.random() - 0.5;
var offset = e1.multiplyScalar(lambda).add(e2.multiplyScalar(mu));
offset.normalize();
offset.multiplyScalar(radius) // multiply the compute offset by the radius you'd like it to circle around
return offset;
}
, 원하는 지점 생성 :
function pointOnHotDog(p, q, radius) {
return pointOnPath(p, q).add(getVectorOffset(p, q, radius));
}
여기에 이것에 대한 너무 많은 작업 jsfiddle
관련 문제
- 1. three.js를 사용하여 평행선을 그리는 방법은 무엇입니까?
- 2. Three.js를 입자 시스템은 다른 개체 뒤에 강제로?
- 3. C++에서 벡터 벡터를 정의하는 방법은 무엇입니까?
- 4. Three.js를 사용하여 2D에서 3D로 프로젝트
- 5. URL에서 작업이 필요없는 경로를 정의하는 방법은 무엇입니까?
- 6. application.rb에서 레일 옵저버 경로를 정의하는 방법은 무엇입니까?
- 7. 둘 이상의 위치에서 경로를 정의하는 방법은 무엇입니까?
- 8. 레일 애플리케이션의 경로를 올바르게 정의하는 방법은 무엇입니까?
- 9. Three.js를 사용하여 lensflare를 추가하는 방법은 무엇입니까?
- 10. Three.js를 사용하여 CubeGeometry의 너비를 변경하는 방법은 무엇입니까?
- 11. three.js를 사용하여 개체를 선택하고 숨기는 방법은 무엇입니까?
- 12. 모듈 경로를 기준으로 파일을로드하는 방법은 무엇입니까?
- 13. g-score를 기준으로 경로를 수정하는 방법은 무엇입니까?
- 14. yeoman과 three.js를 시작하는 방법은 무엇입니까?
- 15. 브라우저에서 '구름을 통해 움직이는'애니메이션을 얻는 방법은 무엇입니까?
- 16. iPhone OpenGLES를 사용하여 3D로 구름을 그리는 방법은 무엇입니까?
- 17. Flash, jQuery 또는 JavaScript를 사용하여 스크롤 구름을 만드는 방법은 무엇입니까?
- 18. SFML - 범위를 벗어나는 입자 시스템 벡터
- 19. Tomcat 6에서 응용 프로그램의 컨텍스트 경로를 정의하는 방법은 무엇입니까?
- 20. Excel 수식을 사용하여 경로를 정의하는 방법
- 21. three.js를
- 22. 경로를 기준으로 MPTT 스타일 테이블을 쿼리하는 가장 효율적인 방법은 무엇입니까?
- 23. HTML5 캔버스의 순환 경로를 따르는 입자 생성
- 24. xaml에서 벡터 경로를 만듭니다.
- 25. Three.js를 - 질감
- 26. 입자 색상을 임의로 변경하는 방법은 무엇입니까?
- 27. Three.js를 사용하여 Maya 모델로드하기
- 28. THREE.JS를 사용하여 롤링
- 29. three.js를 사용하여 json 모델로드하기
- 30. 입자 시스템 : 입자 생성
감사입니다! 나는 내 파일에서 그걸로 어지럽 혔고, 제대로 작동하지 못한다. 입자는 z 축의 거리로 펼쳐지지만 x 축과 y 축에는 방사하지 않습니다. 나는 내 말을 볼 수 있도록 아래를 내려다 보는 관점으로 바이올린을 완성했다. 생각? http://jsfiddle.net/gromiczek/32nzX/ – gromiczek
작은 오타를 만들었습니다.'e1'은'(v.y, 0, -v.x)'대신'(v.y, -v.x, 0)'이되어야합니다. http://jsfiddle.net/6uL48/'getVectorOffset'을'e1' 또는'e2' 중 하나를 반환하도록 변경 했으므로 타원체 패턴을보다 쉽게 식별 할 수 있고, 필요합니다. –
필자는 파일에서 편집 내용을 코딩하고 클라우드를 돌 렸을 때 (OrbitControls가 설치되어 있음)이를 관찰했을 때 튜브가 아닌 직사각형으로 판명되었음을 알았습니다. 그러나,'offset.multiplyScalar (radius)'를'offset.setLength (radiusRange * Math.random())'으로 변경하고 튜브 모양의 1/4을 얻었습니다. 여기를보십시오 : http://jsfiddle.net/gromiczek/6uL48/1/ (궤도 제어 장치 없이는보기가 어렵습니다.) 나는 지난 3/4 분기를 얻기 위해 여전히 간섭하고 있습니다.;) – gromiczek