четверг, 20 декабря 2012 г.

На этом функции заканчиваются. В следующий раз попробуем собрать всё вместе.
А пока несколько источников по программированию COFFEE:
*************
_COFFEE BIBLE - скрипты для книги
_COFFEE_R_13_SDK_CHM.chm
_COFFEE_R12_SDK_CHM_2010_09_08.chm
COFFEE_Book_sample.pdf
CoffeeBible_Updated 11-13-10.pdf
DevKitchen_R_11_2009.pdf
R12Development.pdf
Coffee ID's_R12.txt
Render Settings.txt
ViewSetting.txt
***************
Всё это в файле _COFFEE BIBLE.ZIP по адресу:
http://narod.ru/disk/64639356001.bf76c4448ae0dde52e18466795e5363f/_COFFEE%20BIBLE.ZIP.html

Функция изменения позиции объекта

Функция изменения позиции объекта:
Иногда требуется изменить положение объекта и вызывается эта функция.

//**************************

PosObj(vDoc)//Функция изменения позиции объекта (позиция по Y,Z, и поворот на 90 градусов по Z) окончательная
{
para#ID_BASEOBJECT_REL_POSITION:VECTOR_X=paraPX;//Позиция по X (paraPX)
para#ID_BASEOBJECT_REL_POSITION:VECTOR_Y=paraPY;//Позиция по Y (paraPY)
para#ID_BASEOBJECT_REL_POSITION:VECTOR_Z=paraPZ;//Позиция по Z (paraPZ) (paraPX)
para#ID_BASEOBJECT_REL_ROTATION:VECTOR_X=paraRX;//Поворот на 90 градусов (paraRX) (paraRY) (paraRZ)
para#ID_BASEOBJECT_REL_ROTATION:VECTOR_Y=paraRY;//Поворот на 90 градусов (paraRX) (paraRY) (paraRZ)
para#ID_BASEOBJECT_REL_ROTATION:VECTOR_Z=paraRZ;//Поворот на 90 градусов (paraRX) (paraRY) (paraRZ)
}
//**********************

Функция конца рисования и установки плоскости и света

Функция конца рисования и установки плоскости и света:
Эта функция производит визуальные изменения в документе, то есть устанавливает сцену и объект в центре её.

//**************************

fPara(vDoc)//Функция конца рисования и установки плоскости и света
{
 fSetActiveObject(vDoc,para);//Вызов функции fSetActiveObject
 GeEventAdd(DOCUMENT_CHANGED);//Вызов функции GeEventAdd с аргументом NEW_ACTIVE_OBJECT с изменением в активном документе
  para->Message(MSG_UPDATE);

  return TRUE;
   }
//*********************

Функция активизации объекта

Функция активизации объекта:
Здесь мы устанавливаем "сцену".

  1. Делаем наш объект активным - vObj->SetBit(BIT_AOBJ);
  2. Вызываем Функцию создания фонга для материалов
  3. Вызов функцию проверки наличия 3х материалов, если они остались от предыдущего объекта, стираем их.
  4. Вызываем Функцию создания нового материала и деактивируем его
  5. Вызываем функцию создания плоскости, над которой будет находиться объект.
  6. Вызываем функцию создания Sky primitive (небо).
  7. Вызываем функцию создания Light primitive (свет)
  8. Деактивируем объект


//*****************************

fSetActiveObject(vDoc,vObj)//Функция активизации объекта
   {
       var vAObj = GetActiveObject(vDoc);
        if (vAObj) vAObj->DelBit(BIT_AOBJ);
        vObj->SetBit(BIT_AOBJ);
        GeEventAdd(NEW_ACTIVE_OBJECT);

CreaPhong(vDoc);//Функция создания фонга
ProvMat(vDoc);//Вызов функции проверки наличия 3х материалов
CreaMat(vDoc);//Функция создания нового материала
vObj->DelBit(BIT_ACTIVE); //Unselect the object in the hierarchy
CreaPlane(vDoc);//Вызов функции создания плоскости
CreaSky(vDoc); // Вызов функции создания Sky primitive
CreaLight(vDoc);  // Вызов функции создания Light primitive
//vOp = vDoc->GetActiveObject();
//vOp->DelBit(BIT_ACTIVE); //Unselect the object in the hierarchy
}//конец Функции активизации объекта
//***************************

Дополнительный рисователь полигонов по x,y,z

Дополнительный рисователь полигонов по x,y,z:
Иногда, при сложной форме объекта, из-за допусков точности возникают "дырки" в объекте. Чтобы их компенсировать, применяется эта функция.

//************************

RisPolDop(vDoc)//Дополнительный рисователь полигонов по x,y,z (кое-где он не нужен)
{
             for (j=0;j<Nv;j++)
{
             P1=j;
             P2=j+1;
             P4=Nv*(Nu-1)+j;
             P3=Nv*(Nu-1)+j+1;
             para->SetPolygon(zz,P4,P3,P2,P1);
             zz=zz+1;
}
             P1=0;
             P2=Nv-1;
             P3=Nv*Nu-1;
             P4=Nv*(Nu-1);
             para->SetPolygon(zz,P1,P2,P3,P4);
}
//Конец дополнительного рисователя полигонов по x,y,z

Главный рисователь полигонов по x,y,z-координатам.

Главный рисователь полигонов по x,y,z-координатам:
Здесь мы просто вычисляем порядковые номера четырёх точек каждого полигона, то есть именно здесь привязываем вычисленные 3D точки к конкретным полигонам. Это делает "цикл" по рядам и колоннам полигонов.
Точки сохраняются в массиве переменной SetPolygon
zz - номер полигона по порядку.
Второй "цикл", это закрытие шва нашей "простыни".
//*************************

RisPol(vDoc)//Главный рисователь полигонов по x,y,z-координатам
{
                  zz=0;
                  for (i=0;i<Nu-1;i++)
{
                  for (j=0;j<Nv-1;j++)
{
                    P1=i*Nv+j;
                    P2=i*Nv+j+1;
                    P4=(i+1)*Nv+j;
                    P3=(i+1)*Nv+j+1;
                    para->SetPolygon(zz,P1,P2,P3,P4);
                    zz=zz+1;
}
}
            for (i=0;i<Nu-1;i++)
{
             P1=i*Nv;
             P2=(i+1)*Nv-1;
             P4=(i+1)*Nv;
             P3=(i+2)*Nv-1;
             para->SetPolygon(zz,P4,P3,P2,P1);
             zz=zz+1;
}
}
//**************************

среда, 19 декабря 2012 г.

Функция формулы объекта

Функция формулы объекта:
Немного теории.
Чтобы построить трёхмерный объект, надо вычислить его точки в пространстве и по этим точкам установить полигоны (плоскости).
Проще всего представить себе простыню, которой мы обернём объект. Так, как мы оборачиваем объект по кругу, мы должны применить число ПИ (3,14), оно наиболее точно сводит концы с концами. Итак у нас имеется простына шириной =U и длиной равной V.
Протяженность по U будет равна от uMin до uMax, в данном случае от 0 до 4ПИ.
Протяженность по V будет равна от vMin до vMax, в данном случае от 0 до 2ПИ.
Ещё одна важная вещь. Количество полигонов. Чем меньше полигонов (плоскостей, построенных по точкам), тем грубее форма объекта, чем больше полигонов, тем глаже форма, но время на расчёты увеличивается. То есть полигоны на нашей простыне будут выглядеть, как квадраты. По стороне V это будут ряды Nv=300, по стороне U это будут колонны Nu=300. Ширина и длина каждого полигона будет равна:

du=(uMax-uMin)/Nu;//-ширина полигона
dv=(vMax-vMin)/Nv;//-длина полигона
В данной функции мы начинаем вычислять положения точек объекта в 3D пространстве. То есть каждая точка должна получить значения по оси X, Y и Z. Эти значения будут вычисляться по следующей формуле:

                x= r*cos(v)*cos(u)+R*cos(u)*(1+a*cos(n*u));
                 y= 2.5*(r*sin(v)+a*sin(n*u));
                 z= r*cos(v)*sin(u)+R*sin(u)*(1+a*cos(n*u));
Чтобы вычислить все точки объекта, мы делаем так называемый "цикл", то есть по очереди вычисляем точки рядов полигонов и двигаемся по  их колоннам.
Все три координаты будут запоминаться в виде вектора в конце каждого цикла в переменной SetPoint:
para->SetPoint(zz,vector(x*f,y*f,z*f));
var f = Увеличение-Scale


var zz = номер каждой точки по порядку.
//*************************

 Form1(vDoc)//Функция формулы №1-Endless
{
      var uMin = 0.0;
      var uMax = 25.13274122;
      var vMin = 0.0;
      var vMax = 6.283185307;
du=(uMax-uMin)/Nu;//-ширина полигона
dv=(vMax-vMin)/Nv;//-длина полигона
             zz=0;
             for (i=0;i<Nu;i++)//300 колонн
{
             for (j=0;j<Nv;j++)//300 рядов
{
              u=uMin+i*du;//Идём по колоннам через ширину полигона
              v=vMin+j*dv;//Идём по рядам через длину полигона
var f = 75;//Увеличение-Scale
      var a = .5;//Общий диаметр .5
      var n = 2.25;//Количество 2.25
      var R = 2.0;//Увеличение 7,8,9,
      var r = 0.3;//Удлинение 0.3-шар
                 x= r*cos(v)*cos(u)+R*cos(u)*(1+a*cos(n*u));
                 y= 2.5*(r*sin(v)+a*sin(n*u));
                 z= r*cos(v)*sin(u)+R*sin(u)*(1+a*cos(n*u));
                para->SetPoint(zz,vector(x*f,y*f,z*f));
                zz=zz+1;
}
}
}//конец функции формулы №1
//**************************************