Поделюсь кодом: включить все объекты в камеру.
От: falcoware Россия https://falcoware.com/rus/
Дата: 21.10.20 10:48
Оценка:

void CScene::SmartZoom(float x, float y)
{
// fill Vershiny of piramid...
point3d vtDir;
sub_vectors(&vtDir.x, &IniSet.ptCamPos.x, &IniSet.ptCamTarget.x);

IniSet.ptCamTarget.x = x;
IniSet.ptCamTarget.y = y;
IniSet.ptCamTarget.z = 0.f;

scale_vect(&vtDir.x, 1000.f);
add_vectors(&IniSet.ptCamPos.x, &vtDir.x, &IniSet.ptCamTarget.x);

float fOldDCam = 0.f;
float fSavedDCam = vec_length(&vtDir.x);

for(int ax = 0; ax < 30; ax++){
float fNewDist = (fSavedDCam + fOldDCam) / 2.f;
norm_vect(&vtDir.x);
scale_vect(&vtDir.x, fNewDist);
add_vectors(&IniSet.ptCamPos.x, &vtDir.x, &IniSet.ptCamTarget.x);

point3d versh[4];
point3d eye = { IniSet.ptCamPos.x, IniSet.ptCamPos.y, IniSet.ptCamPos.z };
Screen2World(0, 0, versh[0]);
Screen2World(nScreenSzX, 0, versh[1]);
Screen2World(nScreenSzX, nScreenSzY, versh[2]);
Screen2World(0, nScreenSzY, versh[3]);

int ix, sz = parrObjs.Size();

// Create faces of piramid and search collision with it...
point3d Piramid[4][3];
Piramid[0][0] = eye;
Piramid[1][0] = eye;
Piramid[2][0] = eye;
Piramid[3][0] = eye;
Piramid[0][1] = versh[0];
Piramid[0][2] = versh[1];
Piramid[1][1] = versh[1];
Piramid[1][2] = versh[2];
Piramid[2][1] = versh[2];
Piramid[2][2] = versh[3];
Piramid[3][1] = versh[3];
Piramid[3][2] = versh[0];

// Dyadya WALERA!!!!
BOOL OutFlag = FALSE;
for(ix = nObjOff; ix < sz; ix++){
CObj3d *pObj = parrObjs.e(ix);
pObj->Transform(FALSE);
point3d ptPos = pObj->GetPosition();

plane gran;
for(int jx = 0; jx < 4; jx++){
comp_plane_eqn(&gran.a, &Piramid[jx][0].x, &Piramid[jx][1].x, &Piramid[jx][2].x);
float f1 = gran.a*ptPos.x + gran.b*ptPos.y + gran.c*ptPos.z + gran.d;
float f2 = gran.d;
if(f1*f2 < 0.f){
OutFlag = TRUE;
break;
}
}
if(OutFlag){ break; }
}

sub_vectors(&vtDir.x, &IniSet.ptCamPos.x, &IniSet.ptCamTarget.x);
float fDist = vec_length(&vtDir.x);
if(OutFlag){
fOldDCam = fDist;
}
else{
fSavedDCam = fDist;
}
}

// CString sss;
// sss.Format("%f", IniSet.ptCamPos.z);
// AfxMessageBox(sss);

MoveCameraSomeBack();
GluLookAt();

// sss.Format("%f", IniSet.ptCamPos.z);
// AfxMessageBox(sss);
}

void CScene::SmartZoomForSomeObjects(Array<CObj3d *> &pObjsAll)
{
// This procedure places camera in position of visibility of
// all chosen objects. Procedure does not change directions of camera.
matrix MatrCm;
MatrCm.m[0][0] = IniSet.vsCamSystem.axis_x.x;
MatrCm.m[0][1] = IniSet.vsCamSystem.axis_x.y;
MatrCm.m[0][2] = IniSet.vsCamSystem.axis_x.z;
MatrCm.m[0][3] = 0.f;
MatrCm.m[1][0] = IniSet.vsCamSystem.axis_y.x;
MatrCm.m[1][1] = IniSet.vsCamSystem.axis_y.y;
MatrCm.m[1][2] = IniSet.vsCamSystem.axis_y.z;
MatrCm.m[1][3] = 0.f;
MatrCm.m[2][0] = IniSet.vsCamSystem.axis_z.x;
MatrCm.m[2][1] = IniSet.vsCamSystem.axis_z.y;
MatrCm.m[2][2] = IniSet.vsCamSystem.axis_z.z;
MatrCm.m[2][3] = 0.f;
MatrCm.m[3][0] = 0.f;
MatrCm.m[3][1] = 0.f;
MatrCm.m[3][2] = 0.f;
MatrCm.m[3][3] = 1.f;

int ix, jx, sz = pObjsAll.Size();
Array<point3d> arrObjPos;
Array<CObj3d *> pObjs;

for(ix = nObjOff; ix < sz; ix++){
CObj3d *pObj = pObjsAll.e(ix);
if(!IniSet.bSpotCloakedObjects){
if(pObj->IsHidden()){ continue; }
}

pObjs.Append(pObj);

pObj->Transform(FALSE);
point3d ptPos;
transform_point(&ptPos, &pObj->GetPosition(), &MatrCm);
arrObjPos.Append(ptPos);
}// ix definiton of all ObjPos divide about camera

float fxy = 1000.f;
float fxz = 1000.f;
float LB_TAN_45_2_RAD_Y = m_fCameraAngle * pixel_sz;
float LB_TAN_45_2_RAD_Z = m_fCameraAngle;
float fdy, fdz;
int iy,jy,iz,jz;
BOOL noSelect = TRUE;

sz = pObjs.Size();
if(!sz){ return; }
if(sz == 1){
CObj3d *pObj = pObjs.e(0);
pObj->Transform(FALSE);
point3d ptPos = pObj->GetPosition();
SmartZoom(ptPos.x, ptPos.y);
return;
}

for(ix = 0; ix < sz; ix++){
CObj3d *pObj = pObjs.e(ix);
float SizeObi = pObj->fObjSize / 1.75f; // SizeObi = 0.f;
for (jx = ix; jx < sz; jx++) {
pObj = pObjs.e(jx);
float SizeObj = pObj->fObjSize / 1.75f; // SizeObj = 0.f;
if (arrObjPos[ix].y < arrObjPos[jx].y) {
float fbi = (arrObjPos[ix].y — SizeObi) + LB_TAN_45_2_RAD_Y * arrObjPos[ix].x;
float fbj = (arrObjPos[jx].y + SizeObj) — LB_TAN_45_2_RAD_Y * arrObjPos[jx].x;
float ffx = (fbi — fbj) * 0.5f / LB_TAN_45_2_RAD_Y;
if (ffx < fxy) {
iy = ix;
jy = jx;
fxy = ffx;
fdy = (fbi + fbj) * 0.5f;
}//if
}//then
else {
float fbi = (arrObjPos[ix].y + SizeObi) — LB_TAN_45_2_RAD_Y * arrObjPos[ix].x;
float fbj = (arrObjPos[jx].y — SizeObj) + LB_TAN_45_2_RAD_Y * arrObjPos[jx].x;
float ffx = (fbj — fbi) * 0.5f / LB_TAN_45_2_RAD_Y;
if (ffx < fxy) {
iy = jx;
jy = ix;
fxy = ffx;
fdy = (fbi + fbj) * 0.5f;
}//if
}//else
if (arrObjPos[ix].z < arrObjPos[jx].z) {
float fbi = (arrObjPos[ix].z — SizeObi) + LB_TAN_45_2_RAD_Z * arrObjPos[ix].x;
float fbj = (arrObjPos[jx].z + SizeObj) — LB_TAN_45_2_RAD_Z * arrObjPos[jx].x;
float ffx = (fbi — fbj) * 0.5f / LB_TAN_45_2_RAD_Z;
if (ffx < fxz) {
iz = ix;
jz = jx;
fxz = ffx;
fdz = (fbi + fbj) * 0.5f;
}//if
}//then
else {
float fbi = (arrObjPos[ix].z + SizeObi) — LB_TAN_45_2_RAD_Z * arrObjPos[ix].x;
float fbj = (arrObjPos[jx].z — SizeObj) + LB_TAN_45_2_RAD_Z * arrObjPos[jx].x;
float ffx = (fbj — fbi) * 0.5f / LB_TAN_45_2_RAD_Z;
if (ffx < fxz) {
iz = jx;
jz = ix;
fxz = ffx;
fdz = (fbi + fbj) * 0.5f;
}//if
}//else
}// jx
}// ix

// offset of camera
point3d pos;
if(fxz > fxy){
pos.x = fxy;
pos.y = fdy;
pos.z = ( (arrObjPos[iz].x — fxy)
* (arrObjPos[jz].z + pObjs.e(jz)->fObjSize / 1.75f)
+ (arrObjPos[jz].x — fxy)
* (arrObjPos[iz].z — pObjs.e(iz)->fObjSize / 1.75f))
/((arrObjPos[iz].x — fxy) + (arrObjPos[jz].x — fxy));
}
else {
pos.x = fxz;
pos.z = fdz;
pos.y = ( (arrObjPos[iy].x — fxz)
* (arrObjPos[jy].y + pObjs.e(jy)->fObjSize / 1.75f)
+ (arrObjPos[jy].x — fxz)
* (arrObjPos[iy].y — pObjs.e(iy)->fObjSize / 1.75f))
/((arrObjPos[iy].x — fxz) + (arrObjPos[jy].x — fxz));
}

transform_back_point(&pos, &pos, &MatrCm);

IniSet.ptCamPos.x = pos.x;
IniSet.ptCamPos.y = pos.y;
IniSet.ptCamPos.z = pos.z;

pos.z = 0.f;
IniSet.ptCamTarget = pos;

MoveCameraSomeBack();
GluLookAt();
}

https://falcoware.com/rus/ — Бесплатные Игры!!!
Отредактировано 21.10.2020 10:49 falcoware . Предыдущая версия .
Re: Поделюсь кодом: включить все объекты в камеру.
От: Черный Властелин Австралия https://www.softperfect.com
Дата: 21.10.20 12:30
Оценка: :))) :)
Здравствуйте, falcoware, Вы писали:


F>[q]

F>void CScene::SmartZoom(float x, float y)
F>{
F>// fill Vershiny of piramid...

Это чо за язык, церковно-славянский? :D
Re[2]: Поделюсь кодом: включить все объекты в камеру.
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 21.10.20 15:11
Оценка: :))
Здравствуйте, Черный Властелин, Вы писали:

F>>// fill Vershiny of piramid...


ЧВ>Это чо за язык, церковно-славянский? :D


Си со скрепами.
Re: Поделюсь кодом: включить все объекты в камеру.
От: scf  
Дата: 22.10.20 07:05
Оценка: +1
Здравствуйте, falcoware, Вы писали:


F>

F>// fill Vershiny of piramid...


Одна строчка, а сколько может рассказать об авторе этого кода...
Re: Поделюсь кодом: включить все объекты в камеру.
От: std.denis Россия  
Дата: 22.10.20 08:02
Оценка: +1 :)
Здравствуйте, falcoware, Вы писали:
F> <...поскипанная куча говна...>

Блин, у тебя кнопка "Предпросмотр" платная что ли?
Не касаясь качества кода и вообще смысла постинга этого куска сюда, ты не видишь, что всё форматирование поплыло?
Re[2]: Поделюсь кодом: включить все объекты в камеру.
От: falcoware Россия https://falcoware.com/rus/
Дата: 22.10.20 08:45
Оценка: -2 :)
SD>Блин, у тебя кнопка "Предпросмотр" платная что ли?
SD>Не касаясь качества кода и вообще смысла постинга этого куска сюда, ты не видишь, что всё форматирование поплыло?

# Матфея 26:62
⁶² И, встав, первосвященник сказал Ему: что же⁶² ничего не отвечаешь? что́ они против Тебя свидетельствуют? Матфея 26:62
© Библия Онлайн, 2003-2020.

# Деяния 8:32-33
³² А место из Писания, которое он читал, было сие: «как овца, веден был Он на заклание, и, как агнец пред стригущим его безгласен, так Он не отверзает уст Своих. ³³ В уничижении Его суд Его совершился. Но род Его кто разъяснит? ибо вземлется от земли жизнь Его».Деяния 8:32-33
© Библия Онлайн, 2003-2020.
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[3]: Поделюсь кодом: включить все объекты в камеру.
От: temnik Россия  
Дата: 22.10.20 12:25
Оценка:
Фалько решил последовать советам Музыченко и задепонировать исходники?
Лучший хостинг от 4 евро, VPS от 6 евро, разные локации, оплата картами без проблем, скидки до 20%.
50 бесплатных смс
Re: Поделюсь кодом: включить все объекты в камеру.
От: kov_serg Россия  
Дата: 22.10.20 12:48
Оценка: :))
Здравствуйте, falcoware, Вы писали:

F>

...


Re[2]: Поделюсь кодом: включить все объекты в камеру.
От: falcoware Россия https://falcoware.com/rus/
Дата: 22.10.20 13:06
Оценка:
Здравствуйте, kov_serg, Вы писали:

Переписка с программистом:
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[4]: Поделюсь кодом: включить все объекты в камеру.
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 22.10.20 13:21
Оценка:
Здравствуйте, temnik, Вы писали:

T>Фалько решил последовать советам Музыченко и задепонировать исходники?


Когда и кому Музыченко советовал такую глупость?
Re[5]: Поделюсь кодом: включить все объекты в камеру.
От: temnik Россия  
Дата: 22.10.20 18:14
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, temnik, Вы писали:


T>>Фалько решил последовать советам Музыченко и задепонировать исходники?


ЕМ>Когда и кому Музыченко советовал такую глупость?


Дык вот же — http://rsdn.org/forum/shareware/7853028.1
Автор: Евгений Музыченко
Дата: 14.10.20

Лучший хостинг от 4 евро, VPS от 6 евро, разные локации, оплата картами без проблем, скидки до 20%.
50 бесплатных смс
Re[6]: Поделюсь кодом: включить все объекты в камеру.
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 22.10.20 18:59
Оценка:
Здравствуйте, temnik, Вы писали:

T>>>Фалько решил последовать советам Музыченко и задепонировать исходники?


ЕМ>>Когда и кому Музыченко советовал такую глупость?


T>Дык вот же — http://rsdn.org/forum/shareware/7853028.1
Автор: Евгений Музыченко
Дата: 14.10.20

T>

А вот temnik советовал
Автор: temnik
Дата: 20.10.20
предупреждать о false positive антивирусов.

А еще ученые регулярно насилуют журналистов...
Re[7]: Поделюсь кодом: включить все объекты в камеру.
От: falcoware Россия https://falcoware.com/rus/
Дата: 23.10.20 06:16
Оценка:
ЕМ>А еще ученые регулярно насилуют журналистов...

Слыхал про супер крутые 3Д волосы от Nvidia Hairworks?) На фалко энжине это наверное выглядело бы так:
https://zen.yandex.ru/media/id/5f57a9daccc2347a769a4f4c/poteria-parika-5f8d60c04ab7c3765a2c0635
https://falcoware.com/rus/ — Бесплатные Игры!!!
Re[2]: Поделюсь кодом: включить все объекты в камеру.
От: Dym On Россия  
Дата: 30.10.20 07:54
Оценка:
Здравствуйте, scf, Вы писали:

scf>Одна строчка, а сколько может рассказать об авторе этого кода...

Использование форматтера [ q] вместо [ ccode] рассказывает гораздо больше (человек не первый день на форуме).
Счастье — это Glück!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.