Hirdetés

2024. május 10., péntek

Gyorskeresés

Útvonal

Fórumok  »  Tudomány, oktatás  »  Fizika topic

Hozzászólások

(#1298) Dinter


Dinter
addikt

Sziasztok. Nem teljesen fizika, de talán ide illik a legjobban.

Van egy r(u,v) parametrikus felületem. Ezen szeretnék egy tárgyat mozgatni úgy, hogy helyes legyen az orientációja. Ezt úgy tenném, hogy a mozgás irányvektorát (i) megkapom azáltal, hogy összeadom a két változó szerinti parciális deriváltat az adott pontban. A felület normálvektora (k) a parciális deriváltak keresztszorzata. Ezen kettő keresztszorzatával pedig megkapom j-t. Most ez elvileg jó is lenne, viszont az objektumom nem megy teljesen egyenesen előre, hanem kicsit oldalra fordul. Elképzelésem szerint a parciális deriváltnak kéne rossznak lennie, viszont 3-szor leellenőriztem neten, és elvileg jónak kéne lennie. Berakok ide két kódrészletet, hátha találtok benne hibát.

ParamSurface * kleinSurface = new Klein();
VertexData vd = kleinSurface->GenVertexData(pos.x, pos.y);

vec3 i = normalize(vd.drdU + vd.drdV);
vec3 k = normalize(vd.normal);
vec3 j = normalize(cross(k, i));

mat4 RotateTranslate = mat4(i.x, i.y, i.z, 0,
j.x, j.y, j.z, 0,
k.x, k.y, k.z, 0,
vd.position.x, vd.position.y, vd.position.z, 1);

VertexData vd;
float fx, fy, fz;

float U = u * 2.0f * (float)M_PI, V = v * 2.0f * (float)M_PI;
float a = 6.0f * cosf(U) * (1+sinf(U));
float b = 16.0f * sinf(U);
float c = 4.0f * (1.0f - cosf(U) / 2.0f);

if ((float)M_PI < U && U <= (float) M_PI * 2.0f) {
fx = a + c * cosf(V + (float)M_PI);
fy = b;
fz = c * sinf(V);

vec3 drdU=vec3(6.0f * cosf(U)*cosf(U)-2.0f*sinf(U)*(3.0f*sinf(U)+cosf(V)+3.0f),
16.0f*cosf(U),
2.0f*sinf(U)*sinf(V));

vec3 drdV=vec3(-2*(cosf(U)-2.0f)*sinf(V),
0,
-2.0f*(cosf(U)-2)*cosf(V));

vd.normal = cross(drdU, drdV);
vd.position = vec3(fx, fy, fz);
vd.drdU = drdU;
vd.drdV = drdV;
}

else {
fx = a + c * cosf(U) * cosf(V);
fy = b + c * sinf(U) * cosf(V);
fz = c * sinf(V);

vec3 drdU= vec3(4*sinf(U)*cosf(U)*cosf(V)-2*sinf(U)*(3*sinf(U)+2*cosf(V)+3)+6*cosf(U)*cosf(U),
-2*cosf(U)*cosf(U)*cosf(V)+4*cosf(U)*(cosf(V)+4.0f)+2.0f*sinf(U)*sinf(U)*cosf(V),
2.0f * sinf(U)*sinf(V));

vec3 drdV= vec3(2*(cosf(U)-2)*cosf(U)*sinf(V),
2.0f*sinf(U)*(cosf(U)-2)*sinf(V),
4.0f * (1.0f - cosf(U) / 2.0f)*cosf(V));

vd.normal = cross(drdU, drdV);
vd.drdU = drdU;
vd.drdV = drdV;
vd.position = vec3(fx, fy, fz);
}

Útvonal

Fórumok  »  Tudomány, oktatás  »  Fizika topic
Copyright © 2000-2024 PROHARDVER Informatikai Kft.