Этот скрипт создаёт красивую параметрическую фигуру из нескольких параллельных "узлов".
Скрипт работает только в Скрипт-менеджере, так, как главная функция 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);//Запустить меню в позиции мыши
}
//***************************************
Скрипт работает только в Скрипт-менеджере, так, как главная функция 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);//Запустить меню в позиции мыши
}
//***************************************
Читают, читают, я например :) Правда для меня этот кофе тёмный лес, но уж очень хочется его выучить. Так что продолжайте!!!
ОтветитьУдалитьЭтот скрипт нигде не получается заставить работать: ни в скрипт-менеджере, не созданием файла с расширением cof в папке плагинов.
ОтветитьУдалитьЕщё раз специально проверил:
ОтветитьУдалитьВыделяю от //**** до //*****, копирую Ctrl+c, Запускаю Синему12,там нажимаю Script Manager, в нём нажимаю New, даю имя, и в окно для скрипта Ctrl+V.
В самом низу окна нажимаю Execute, вместо неё появляется кнопка OK, нажимаю её, на экране появляется фигура.
В Синеме13, то же самое, только кнопка "OK" появляется в верхнем левом углу экрана.