суббота, 14 июля 2012 г.

Этот скрипт создаёт красивую параметрическую фигуру из нескольких параллельных "узлов".
Скрипт работает только в Скрипт-менеджере, так, как главная функция main(doc,op) содержит операнды "doc" и "op".
Проверено на 12 и 13 версии СИНЕМЫ.
После нажатия на кнопку "Execute", должна под курсором мыши появиться кнопка "OK", надо её нажать, появится картинка.
В 13 версии СИНЕМЫ кнопка "ОК" появляется в левом, верхнем углу экрана.
Если процессор слабый, то надо подождать пока идут расчёты, у меня это длится секунды три.

//*************************************
//This Script was made by senior 14.07.12


       const var cPluginID = 1000777;
       const var cPlugName = "ParaObject";
       const var cPlugHelp = "ParaObject";
       const var cObjName = "ParaObject";
      var cMaxFloat=10000000000;
      var cMaxInt=100000000;
      var para;
      var gDial;
      var Nu = 100;//Субдивайдинг (итерации) по u -Количество полигонов
      var Nv = 100;//Субдивайдинг (итерации) по v -Количество полигоно
      var i,j,k,m;//Индексы      
      var zz;        
      var du;        
      var dv;      
      var SP;      
      var SQ;      
      var x,y,z;      
      var u,v;      
      var P1,P2,P3,P4;
      var vObj,        
      vSP,            
      vPointAry,      
      vSQ,            
      vPolyAry;
//****************************
var Tri;    //Количество групп
var Quart;//Количество итераций в группе
var Trii;//Индекс
var Trij;//Индекс
var Trix=0;//Смещение объекта по x
var Triy=0;//Смещение объекта по y
var Triz=0;//Смещение объекта по z
var TriNu=8;//Субдивайдинг (ширина шага) по u
var TriNv=8;//Субдивайдинг (длина шага) по v
var povtor;//"родитель"
var fTri;
//***************
var mat;
var texTag;
var starttime;//Возвращает время от старта работы CINEMA_4D
var random;//Переменная со значением от Random-псевдо-случайная функция
var rd;//Инициализация красного цвета
var gr;//Инициализация зелёного цвета
var bl;//Инициализация синего цвета
var vOp;
var vDoc;
//Функции:************************************
//*************
RandCol(vDoc)//Функция выбора случайного цвета
{
starttime = time();//Возвращает время от старта работы CINEMA_4D
random = new(Random);//Переменная со значением от Random-псевдо-случайная функция
random->Init(starttime);//Инициализация Random-псевдо-случайной функции
rd=(random->Get01());//Инициализация красного цвета
gr=(random->Get01());//Инициализация зелёного цвета
bl=(random->Get01());//Инициализация синего цвета
}
//*************
CreaMat(vDoc)//Функция создания нового материала
{
mat = new(Material); //Create a new material in memory
mat->SetName("par"); // Имя материала
RandCol(vDoc);//Вызов Random-псевдо-случайной функции
mat#MATERIAL_COLOR_COLOR = vector(rd,gr,bl); // Установка цвета в red-green-blue
vDoc->InsertMaterial( mat, NULL ); // Установка нового материала в Material Manager

//mat#MATERIAL_USE_REFLECTION=TRUE;
//mat#MATERIAL_USE_REFLECTION = COLOR, vector(rd,gr,bl) ; // Установка цвета в red-green-blue

mat#MATERIAL_PREVIEWSIZE=10; // Higher number=higher editor resolution setting
texTag = AllocTag( Ttexture ); //Create a texture tag for the new sphere
texTag#TEXTURETAG_MATERIAL = mat; //links the newly created material to the texture's Material input field
vOp=vDoc->GetActiveObject(); //Load Selected object into memory
vOp->InsertTag(texTag , NULL); //Add it to the scene
}
//*************
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;
}
}
//*******************************Конец Главного рисователя полигонов по x,y,z, координатам 2048 точек!
            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
    UstDoc(vDoc)//Функция установки документа
{
      var vVarChanged,vBackupTags;
      para=new(PolygonObject);
      if (!para) return NULL;
      para->SetName(cObjName);
      vDoc->StartUndo();
      vDoc->AddUndo(UNDO_OBJECT_NEW,para);
      vDoc->EndUndo();
 vVarChanged = new(VariableChanged);
      vBackupTags = new(BackupTags);
      SP=Nu*Nv;
      SQ=Nu*Nv+1;
      vPointAry = new(array, SP);
      para->SetPoints(vPointAry);
      vBackupTags->Init(para);
      vVarChanged->Init(0, SP);
      if (!para->Message(MSG_POINTS_CHANGED, vVarChanged))
   {
 vBackupTags->Restore();
      return NULL;
      }
      vPolyAry = new(array, SQ*4);
      para->SetPolygons(vPolyAry);
      vBackupTags->Init(para);//Init-Бэкапит таги para(предохранитель нехватки памяти)
      vVarChanged->Init(0, SQ);//Init-Бэкапит все точки SQ(предохранитель нехватки памяти)
      if (!para->Message(MSG_POLYGONS_CHANGED, vVarChanged))//Если нет изменений в para-возврат
      {
      vBackupTags->Restore();
      return NULL;//(это нуль, но в адресном пространстве)
      }
      vDoc->InsertObject(para,povtor,NULL);// Вставить объект "детку"в "родителя"
      GeEventAdd(DOCUMENT_CHANGED);
}//****************************конец функции установки документа
   fSetActiveObject(vDoc,vObj)//Функция активирования (выделения) объекта
{
        var vAObj = GetActiveObject(vDoc);
        if (vAObj) vAObj->DelBit(BIT_AOBJ);
        vObj->SetBit(BIT_AOBJ);
        GeEventAdd(NEW_ACTIVE_OBJECT);
}//************************************************
         fPara(vDoc)
{
        fSetActiveObject(vDoc,para);//Вызов функции fSetActiveObject //Функция активирования (выделения) объекта
        GeEventAdd(DOCUMENT_CHANGED);//Вызов функции GeEventAdd с аргументом NEW_ACTIVE_OBJECT с изменением в активном документе
        para->Message(MSG_UPDATE);//Принять изменения в документе
        return TRUE;
}//***********************************************
             Form(vDoc)//Функция формулы объекта
{
      var uMin = 0.0;
      var uMax = pi2;
      var vMin = 0.0;
      var vMax = pi2;
var f = .5;//Увеличение-Scale
var r=10;
du=(uMax-uMin)/Nu;//-ширина полигона
dv=(vMax-vMin)/Nv;//-длина полигона
             zz=0;
             for (i=0;i<Nu;i++)//64 колонны
{
             for (j=0;j<Nv;j++)//32 ряда
{
              u=uMin+i*du;//64 колонны по ширине полигона
              v=vMin+j*dv;//32 ряда по длине полигона
var t=u;
                   x = 88*cos(t) + 115*sin(t) - 475*cos(2*t) - 127*sin(2*t) - 87*cos(3*t) + 36*sin(3*t) + 11*cos(4*t) - 19*sin(4*t);
                   y = 89*cos(t) - 32*sin(t) - 172*cos(2*t) + 294*sin(2*t) + 76*cos(3*t) + 102*sin(3*t) - 61*cos(4*t) + 113*sin(4*t);
                   z = r*cos(v) - 69*sin(t) + 34*cos(2*t) + 223*sin(2*t) + 16*cos(3*t)+ 120*sin(3*t) + 42*cos(4*t) - 125*sin(4*t);
x = x+Trix;
y = y+Triy ;
z = z+Triz;
//println("x = ",x);
                para->SetPoint(zz,vector(x*f,y*f,z*f));
                zz=zz+1;
}
}
}//конец функции формулы объекта
//*****************************************
Povtor(vDoc)//Функция изменения положения объекта
{
var Quart=35;//Количество итераций, 35=круг
var TriNu=8;//Сужение между кольцами после=8 - расширение по u до =8
var TriNv=8;//Сужение между кольцами после=8 - расширение по v до =8
var fTri = 400;//Увеличитель расстояния между шагами (объектами))
var TriuMin = -pi2;
var TriuMax = pi2;
var TrivMin = -pi/9;
var TrivMax = pi/9;
var Tridu=(TriuMax-TriuMin)/TriNu;//-ширина полигона
var Tridv=(TrivMax-TrivMin)/TriNv;//-длина полигона
k=1;
for (m=0;m<Quart;m++)// //Количество итераций
{
u=TriuMin+k*Tridu;//-ширина полигона
v=TrivMin+m*Tridv;//-длина полигона
                    x= sin(u)*cos(v);//Формула перемещения объекта по x
//x= cos(v);
                    y= pow((sin(u)),2);         //Формула перемещения объекта по y
                    //z= sin(u)*sin(v); //Формула перемещения объекта по z
 z= cos(v/2)*sin(v);
//z=0;
Trix=x*fTri;  //Координата повтора по x
Triy=y*fTri; //Координата повтора по y
Triz=z*fTri; //Координата повтора по z

                         UstDoc(vDoc);//Установка объекта повтора в документ
                         Form(vDoc);//Функция формулы повтора
                         RisPol(vDoc);//Главный рисователь полигонов повтора по x,y,z
                         RisPolDop(vDoc);//Дополнительный рисователь полигонов повтора по x,y,z.(кое-где он не нужен)
//fPara(vDoc);//Активировать объект
//CreaMat(vDoc);//Функция создания нового материала
}
}
//**********************Коней функции изменения положения объекта
         class MyDialog :GeModalDialog
{
         public:
         CreateLayout();// определить расположение диалога.
         Command(vID,vMSG);//Всякий раз, когда пользователь нажимает на гаджет, и / или изменяет его значения эта функция будет вызвана.
}
         MyDialog::CreateLayout()
{  
        SetTitle(cPlugName);  //Установить имя диалога плагина
        AddDlgGroup(DR_DLGGROUP_OK); //  Кнопка OK, начало Расчета (Старт)
         return TRUE;//Возвращает значение=1
}
        MyDialog::Command(vID,vMSG)
{
        var vDoc;//Переменная vDoc
       StopAllThreads();//Приостановить все процессы перед исполнением
        switch (vID)//Опрос ячеек диалога,
{
        case 1 : // нажатие кнопки OK (Start)
{
                         vDoc = GetActiveDocument();
                         if (!vDoc) return FALSE;
povtor=new(PolygonObject);//Создать "родительский" объект
vDoc->InsertObject(povtor,NULL,NULL);//Вставить "родительский" объект в документ
povtor#ID_BASEOBJECT_REL_POSITION:VECTOR_X=34;
povtor#ID_BASEOBJECT_REL_POSITION:VECTOR_Y=-136;
povtor#ID_BASEOBJECT_REL_POSITION:VECTOR_Z=-185;
povtor#ID_BASEOBJECT_REL_ROTATION:VECTOR_X=0.284;
povtor#ID_BASEOBJECT_REL_ROTATION:VECTOR_Y=0;
povtor#ID_BASEOBJECT_REL_ROTATION:VECTOR_Z=0;
Povtor(vDoc);
}
}
                          return TRUE;
}
    main(doc,op)//Это главная функция, с которой начинается работа программы-Главпродукт
{
     gDial=new(MyDialog);//Вызвать меню диалога
     gDial->Open(-1,-1);//Запустить меню в позиции мыши
}

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

3 комментария:

  1. Читают, читают, я например :) Правда для меня этот кофе тёмный лес, но уж очень хочется его выучить. Так что продолжайте!!!

    ОтветитьУдалить
  2. Этот скрипт нигде не получается заставить работать: ни в скрипт-менеджере, не созданием файла с расширением cof в папке плагинов.

    ОтветитьУдалить
  3. Ещё раз специально проверил:
    Выделяю от //**** до //*****, копирую Ctrl+c, Запускаю Синему12,там нажимаю Script Manager, в нём нажимаю New, даю имя, и в окно для скрипта Ctrl+V.
    В самом низу окна нажимаю Execute, вместо неё появляется кнопка OK, нажимаю её, на экране появляется фигура.
    В Синеме13, то же самое, только кнопка "OK" появляется в верхнем левом углу экрана.

    ОтветитьУдалить