문제

나는 원하는 이동할 수 있는 입자 직선에서 내의 3D 환경이 있지만 제가 생각할 수 없는 방법을 밖으로 작동하는 다음 위치에 따라 두 지점에서 3D space?

내가 만든 구조체를 나타내는 입자가 있는 위치와 다음에 위치?이 것은 적당한 작동하는 다음 위치를 이동하나요?내가하는 방법을 알고 처음에 설정한 다음 위치를 사용하여 다음과 같은 방법:

// Set particle's direction to a random direction
void setDirection(struct particle *p)
{
    float xnm = (p->location.x * -1) - p->velocity;
    float xnp = p->location.x + p->velocity;
    float ynm = (p->location.y * -1) - p->velocity;
    float ynp = p->location.y + p->velocity;
    float znm = (p->location.z * -1) - p->velocity;
    float znp = p->location.z + p->velocity;

    struct point3f nextLocation = { randFloat(xnm, xnp), randFloat(ynm, ynp), randFloat(znm, znp) };
    p->nextLocation = nextLocation;
}

이는 구조체를 사용했습니다:

// Represents a 3D point
struct point3f
{
    float x;
    float y;
    float z;
};

// Represents a particle
struct particle
{
    enum TYPES type;
    float radius;
    float velocity;
    struct point3f location;
    struct point3f nextLocation;
    struct point3f colour;
};

내가 이것에 대해 완전히 잘못된 방법?

여기의 모든 내 코드 http://pastebin.com/m469f73c2

도움이 되었습니까?

해결책

다른 대답은 약간의 수학입니다. 실제로는 매우 간단합니다.

움직이는 "속도"가 필요합니다. 또한 x, y 및 z 좌표가 있습니다.

한 기간 동안 이동하려면 x 속도를 X 위치에 추가하여 새 x 위치를 얻으려면 Y와 Z를 반복하십시오.

또한, 예를 들어 z 가속도가 일정 할 수있는 "가속"(x, y, z)을 가질 수 있습니다.

마다 속도가 같은 방식으로 재 계산되어야합니다. Velocity X "VX"를 호출하므로 VX는 vx + ax가되고 y 및 z에 대해 반복해야합니다 (다시).

수학 이후 오랜 시간이 지났지 만, 그것이 단위를 추적 할 필요가 없다면 아주 간단하게 기억하는 방법입니다.

다른 팁

입자에는 현재 위치가 하나만 있어야한다고 제안합니다. 또한 속도는 이상적으로 3 개의 구성 요소 자체의 벡터 여야합니다. 함수를 만듭니다 (호출하십시오 move, displace 무엇이든) particle 그리고 시간 기간 t. 이것은 이후의 최종 위치를 계산합니다 t 시간 단위가 경과했습니다.

struct point3f move(struct *particle, int time) {
    particle->location->x = particle->velocity->x * t;
    /* and so on for the other 2 dimensions */
    return particle->location;
}

나는 두 가지를 추천 할 것입니다.

  1. 애니메이션의 기본 벡터 수학에 관한 기사를 읽으십시오. 예를 들어, 이것 플래시 용 2D 벡터를 설명하는 사이트입니다.

  2. 단순한 시작, 1D 포인트로 시작하십시오. 즉, x를 따라 움직이는 지점. 그런 다음 2 차원 (2D 공간에서 2D 포인트)과 3 차원을 추가하십시오. 이것은 기본 역학을 더 잘 이해하는 데 도움이 될 수 있습니다. 도움이 되었기를 바랍니다

물리학의 생각.는 객체의 위치(x,y,z)및 운동 벡터(a,b,c).귀하의 개체가 존재하에서의 위치그것은 운동 벡터 관련 설명하는 그것의 모멘텀이다.에 부족의 추가적인 세력에 개체고 가정하면 움직임에 대해 설명합 벡터의 움직임을 통해 시간 t,위치의 당신의 시간에 물체 x(x+a(t),y+(bt),z+(c*t)).

에서 짧은;하지 않는 저장하는 현재의 위치와 다음에 위치입니다.저장소의 현재 위치와 물체의 모멘텀이다.그것은 쉽게 충분히"선택계"및 업데이트 객체의 위치에 추가하는 간단한 방법으로 추진력하도록 하겠습니다.

속도를 구조 지점 3F로 저장하면 다음과 같은 것이 있습니다.

void move(struct particle * p)
{
  p->position.x += p->velocity.x;
  p->position.y += p->velocity.y;
  p->position.z += p->velocity.z;
}

본질적으로 속도는 매 초/진드기/뭐든간에 위치가 얼마나 많은지입니다.

벡터 수학을 구현하려고합니다 X_{i+1} = X_{i} + Vt. 용 X모래 V 위치와 속도를 각각 나타내는 벡터 t 시간을 나타냅니다. 나는 물리학 자이기 때문에 시간마다 트랙을 따라 거리를 매개 변수화했지만 실제로는 자연스러운 일입니다. 트랙 거리를 제공하려면 속도 벡터를 정규화하십시오 (즉, 스케일 V 그렇게 V.x*V.x + V.y*V.y + V.z*V.z = 1).

사용 struct 위의 요소는 요소에 액세스하는 것이 자연 스럽지만 추가를하기에 편리하지는 않습니다. 배열이 더 좋습니다. 이와 같이:

double X[3];
double V[3];

// initialize

for (int i=0; i<3 ++1){
  X[i] = X[i] + V[i]*t;
}

노조를 사용하면 다음의 장점을 얻을 수 있습니다.

struct vector_s{
  double x;
  double y;
  double z;
}
typedef
union vector_u {
  struct vector_s s; // s for struct
  double a[3];       // a for array
} vector;

입자의 위치와 속도를 모두 연관 시키려면 (매우 합리적인 일) 두 벡터를지지하는 구조를 구성합니다.

typedef
struct particle_s {
  vector position;
  vector velocity;
  //...
} particle_t;

대략적인 모습을 보이는 업데이트 루틴을 실행하십시오.

void update(particle *p, double dt){
  for (int i=0; i<3 ++i){
    p->position.a[i] += p->velocity.a[i]*dt;
  }
}

Afaik, 새로운 위치를 계산하는 방법에는 주로 두 가지 방법이 있습니다. 하나는 다른 하나는 명시 적 속도를 사용하는 설명이있는 것과 같습니다. 다른 가능성은 마지막과 현재 위치를 저장하고 사용하는 것입니다. Verlet 통합. 두 가지 방법 모두 장점과 단점이 있습니다. 이 간섭을 살펴볼 수도 있습니다 페이지.

두 지점 사이의 직선을 따라 움직이려고하는 경우 보간 공식을 사용할 수 있습니다.

P(t) = P1*(1-t) + P2*t

P (t)는 점의 계산 된 위치이며, t는 0에서 1까지의 스칼라이며, p1 및 p2는 끝 점입니다. 위의 첨가는 벡터 첨가입니다 (따라서이 공식을 x, y에 별도로 적용합니다. 그리고 당신의 포인트의 z 구성 요소). t = 0이면 p1을 얻습니다. t = 1이면 P2를 얻고 중간 값의 경우 P1과 P2 사이의 선을 따라 포인트 파트가됩니다. 따라서 T = .5는 P1과 P2 사이의 중간 점을 제공합니다. P1에서 P2까지 세그먼트 외부의 선.

보간 공식을 사용하는 것이 속도를 계산하고 속도가 점 사이의 거리에 비해 작은 경우 라운드 오프 오류를 제한하기 때문에 반복적으로 추가하는 것보다 더 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top