Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 01.09.2011, 21:47   #1
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Странное.

void AnimateMeshok(double vertsize){
    
double ent_scale=xEntityScaleX(picked_entity);
double scale=vertsize*xEntityDistance(Camera,picked_entity)/ent_scale;
Handle parent=picked_entity;
Handle parent_surf=picked_surface;//xPickedSurface();
Handle surf=xGetSurface(Vertexso,0);

xTFormPoint(xEntityX(Camera,1),xEntityY(Camera,1),xEntityZ(Camera,1),0,picked_entity);
// позиция камеры в координатах меша
int camX=xTFormedX();
int camY=xTFormedY();
int camZ=xTFormedZ();
      
// считаю количество точек в меше
int qvert=xCountVertices(parent_surf);

    
int i;
    for(
i=0;i<qvert;i++) {
    
double x,y,z;
    
//базовые координаты смещаю по нормали точки.
        
x=xVertexX(parent_surf,i)+0.02*xVertexNX(parent_surf,i);
        
y=xVertexY(parent_surf,i)+0.02*xVertexNY(parent_surf,i);
        
z=xVertexZ(parent_surf,i)+0.02*xVertexZ(parent_surf,i);
// вектор точка-камера
        
double wcx,wcy,wcz;
            
wcx=x-camX;
            
wcy=y-camY;
            
wcz=z-camZ;
        
// найду любой перпендикуляр x1*x2+y1*y2+z1*z2=0
        // x1*(y1*z1)+y1(-0.5*x1*z1)+z1(-0.5*x1*y1)=0
            
double vx=wcy*wcz;
            
double vy=-0.5*wcx*wcz;
            
double vz=-0.5*wcx*wcy;
            
double length=sqrt(vx*vx+vy*vy+vz*vz)/scale;
            
// нормализация вектора
            
if(length>0) {vx=vx/lengthvy=vy/length;vz=vz/length;}
            
//теперь векторным произведением найду третий перпендикуляр
            
double vvx=wcy*vz-vy*wcz;
            
double vvy=wcz*vx-vz*wcx;
            
double vvz=wcx*vy-vx*wcy;
            
//нормализация вектора
            
length=sqrt(vvx*vvx+vvy*vvy+vvz*vvz)/scale;
            
// нормализация вектора
            
if(length>0) {vvx=vvx/lengthvvy=vvy/length;vvz=vvz/length;}
            
//смещение базовой точки на половинки векторов
            
x=x-0.5*(vvx+vx); y=y-0.5*(vvy+vy); z=z-0.5*(vvz+vz);
    
// этап последний нужно выставить текущие четыре вершины меша на новые позиции.
    
xVertexCoords(surf,4*i,x,y,z);
    
xVertexCoords(surf,4*i+1,(x+vx),(y+vy),(z+vz));
    
xVertexCoords(surf,4*i+2,(x+vvx),(y+vvy),(z+vvz));
    
xVertexCoords(surf,4*i+3,(x+vvx+vx),(y+vvy+vy),(z+vvz+vz));
    
//yeah
    
}

Эта функция для движущихся мешей делает все правильно, а для не двигающихся делает неправильно, оно начинает считать, что родитель для которого рисуются точки находится в позиции 0,0,0 и имеет масштаб 1.

Есть волшебный флаг или надо переписывать?
Меш создается так:
Handle CreateVertexMeshok( ){
        
Handle Surf=xPickedSurface();
        
// считаю количество точек в мешке.
            
int Qvert=xCountVertices(Surf);
        
//создаю меш

        
Vertexso=xCreateMesh(picked_entity);

        
Handle mSurf=xCreateSurface(Vertexso);
    
int i;

    for(
i=0;i<Qvert;i++) {
    
double x,y,z;
        
x=xVertexX(Surf,i);
        
y=xVertexY(Surf,i);
        
z=xVertexZ(Surf,i);
        
int v0,v1,v2,v3;
        
v0=xAddVertex(mSurf,x,y,z,0,0);
        
v1=xAddVertex(mSurf,(x+0.06),y,z,0,1);
        
v2=xAddVertex(mSurf,x,(y+0.06),z,1,0);
        
v3=xAddVertex(mSurf,(x+0.06),(y+0.06),z,1,1);
        
xVertexColor(mSurf,v0,0,0,255);
        
xVertexColor(mSurf,v1,0,0,255);
        
xVertexColor(mSurf,v2,0,0,255);
        
xVertexColor(mSurf,v3,0,0,255);
            
xAddTriangle(mSurf,v1,v0,v2);
            
xAddTriangle(mSurf,v1,v2,v3);
                }
    
xEntityFX(Vertexso,FX_VERTEXCOLOR+FX_FULLBRIGHT);
return 
Vertexso;

Правильно:

Неправильно:


Было бы наоборот я бы не удивился.

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием
Старый 01.09.2011, 22:44   #2
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,073
Написано 247 полезных сообщений
(для 514 пользователей)
Ответ: Странное.

хер знает че ты там делаешь, не стал разбираться, но обычно можно ошибиться в одной вещи это например xPositionEntity он имеет в параметрах модель xyz и ещё важная деталь - использовать глобальные позиции или нет (false true), это есть во всех командах относящихся к трансформации.
ЗЫ. получи xyz глобальные всего объекта и рисуй вертексы vertexX + modelX и т.п. чтоб они правильно рисовались
Это если я правильно понял что ты делаешь )))
(Offline)
 
Ответить с цитированием
Старый 01.09.2011, 22:58   #3
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Ты мне еще справку по блитз3д почитать предложи.

Лучше б "первый нах" написал бы, чесслово.
(Offline)
 
Ответить с цитированием
Старый 01.09.2011, 23:15   #4
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,073
Написано 247 полезных сообщений
(для 514 пользователей)
Ответ: Странное.

Ну а чеж ты тогда запутался с позициями объектов?
(Offline)
 
Ответить с цитированием
Старый 01.09.2011, 23:25   #5
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Скачай, запусти и потом скажи куда твои "позиции" относятся.

А если внятно объяснишь почему это лечится xTurnEntity(picked_entity,360,0,0); в соответствующем месте, то я паду ниц и протру челом ковер, насквозь, пля.
(Offline)
 
Ответить с цитированием
Старый 03.09.2011, 22:27   #6
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

У меня сложилось впечатление, что в хорсе в поверхности не может быть вершин более, чем 81 204 или около того. Это так?
(Offline)
 
Ответить с цитированием
Старый 03.09.2011, 23:09   #7
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Странное.

http://area.xors3d.com/forums/viewto...7&p=3801#p3801
__________________

(Offline)
 
Ответить с цитированием
Старый 03.09.2011, 23:15   #8
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

у меня рисует поверхность с таким кол-вом точек.

На форуме на сайте только на английском языке писать можно?
(Offline)
 
Ответить с цитированием
Старый 03.09.2011, 23:30   #9
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Странное.

Желательно.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (03.09.2011)
Старый 04.09.2011, 03:09   #10
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сочинил нечетко чоткий пик отрезка.



void Draw_Control_Tool(double size){
//нахождение центра выделенных точек.
Vector center=Center_Positioner();
double xc,yc,zc;
xc=center.x;
yc=center.y;
zc=center.z;
double xCam=xEntityX(Camera,1);
double yCam=xEntityY(Camera,1);
double zCam=xEntityZ(Camera,1);
double dist=sqrt((xc-xCam)*(xc-xCam)+(yc-yCam)*(yc-yCam)+(zc-zCam)*(zc-zCam));
size=0.04*dist*size;
//базовая точка
xCameraProject(Camera,xc,yc,zc);
int x0=xProjectedX();
int y0=xProjectedY();

//ось икс
xCameraProject(Camera,xc+size,yc,zc);
int xOx=xProjectedX();
int yOx=xProjectedY();
xColor(255,0,0);
xLine(x0,y0,xOx,yOx);
//ось игрек
xCameraProject(Camera,xc,yc+size,zc);
int xOy=xProjectedX();
int yOy=xProjectedY();
xColor(0,255,0);
xLine(x0,y0,xOy,yOy);
//ось зед
xCameraProject(Camera,xc,yc,zc+size);
int xOz=xProjectedX();
int yOz=xProjectedY();
xColor(0,0,255);
xLine(x0,y0,xOz,yOz);

int mouseX=xMouseX();
int mouseY=xMouseY();
xColor(127,127,127);
xLine(x0,y0,mouseX,mouseY);
// пугающий меня код анализирующий возможное взаимодествие мыши и объекта
// определение совпадения одной из рисуемых осей с позицией мыши.
bool pOx=0;
bool pOy=0;
bool pOz=0;
/* у меня есть две точки для каждой из прямой, значит я могу проверить принадлежит ли третья точка любой из этих прямых.
условие что три точки лежат на одной прямой (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)=0
также пусть в радиусе 5 пикселей от точки центра столкновение не учитывается и после конца стрелки
не учитывается также
*/

// проверка принадлежности точки мыши отрезку

double cccx=(xOx-x0)*(mouseY-y0)-(mouseX-x0)*(yOx-y0);
double cccy=(xOy-x0)*(mouseY-y0)-(mouseX-x0)*(yOy-y0);
double cccz=(xOz-x0)*(mouseY-y0)-(mouseX-x0)*(yOz-y0);

double range=1000;
double lll=sqrt((x0-mouseX)*(x0-mouseX)+(y0-mouseY)*(y0-mouseY));
if (cccx<=range && cccx>=-range && ((xOx-x0)*(mouseX-x0))>0 && ((yOx-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double llx=sqrt((x0-xOx)*(x0-xOx)+(y0-yOx)*(y0-yOx));
if(lll>5 && lll<=llx) {/*если пересеклось то*/ pOx=1;}}

if (cccy<=range && cccy>=-range && ((xOy-x0)*(mouseX-x0))>0 && ((yOy-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double lly=sqrt((x0-xOy)*(x0-xOy)+(y0-yOy)*(y0-yOy));
if(lll>5 && lll<=lly) {/*если пересеклось то*/ pOy=1;}}

if (cccz<=range && cccz>=-range && ((xOz-x0)*(mouseX-x0))>0 && ((yOz-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double llz=sqrt((x0-xOz)*(x0-xOz)+(y0-yOz)*(y0-yOz));
if(lll>5 && lll<=llz) {/*если пересеклось то*/ pOz=1;}}


xColor(255,0,0);
char console[256];
if (pOx) {
sprintf(console, "Ox is picked");
xText (100, 230, console);
}
if (pOy) {
sprintf(console, "Oy is picked");
xText (100, 240, console);
}
if (pOz) {
sprintf(console, "Oz is picked");
xText (100, 250, console);
}
xColor(255,255,255);

}

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием
Старый 04.09.2011, 21:22   #11
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.


Научил "это" неадекватно и коряво шевелить точками модели.
Помоему в средние века сжигали за меньшую ересь
[q] сборсить поверхность.

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием
Старый 07.09.2011, 02:17   #12
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

void xSeedRnd(int seed){
srand(seed);
}

double xRnd(double min, double max){
    double length=max-min;
    double var =((double) rand() / (double)RAND_MAX);
    double value=min+var*length;
return value;
}

int xRand(int min, int max){
    int length=max-min;
    double var =((double) rand() / (double)RAND_MAX);
    int value=min+var*length;
return value;
}

double xMod(double a,double b){
double c=a-b*floor(a/b);
return c;
}
double xAbs(double value){
if (value<0) {value=-value;}
return value;
}
Этих функций мне не хватало
(Offline)
 
Ответить с цитированием
Старый 07.09.2011, 02:20   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Странное.

Почему у тебя xRnd а вторая xRand (разве там нету перегрузки функций).
Синтаксис пляшет, выглядит ужасно, будто сплошной копи-паст.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (07.09.2011)
Старый 07.09.2011, 02:21   #14
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Одно с дробной частью второе целые, як в блитце.
(Offline)
 
Ответить с цитированием
Старый 07.09.2011, 13:04   #15
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Странное.

Сообщение от dsd Посмотреть сообщение
Одно с дробной частью второе целые, як в блитце.
Blitz3D - плохой пример, того как нужно кодить и т.п. Ты не на бэйсике уже, избавляйся от подобных "привычек", они будут конкретно мешать в будущем..
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Colossus (08.09.2011), Mhyhr (07.09.2011), Reizel (18.09.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:17.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com