Вы не авторизованы.

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Fragmenarium. Обсуждение, решение проблем.

ТЕМА: Гибридные фракталы

Гибридные фракталы 5 года 6 мес. назад #1639

  • SCORPION
  • SCORPION аватар
  • Вне сайта
  • Модератор я...
  • Всё получилось, а никто не заметил...(
  • Сообщений: 530
  • Сказали Отлично!: 464
  • Репутация: 38
Впервые читающим эту тему настоятельно рекомендую прочитать мой урок ЗДЕСЬ.
Так как этот урок является как бы продолжением. "Как бы" - это не случайная оговорка. Ибо здесь мы коснёмся создания гибридных фракталов. Что такое гибридный фрактал?
Это такой фрактал, где в одну функцию DE внедрена одна или несколько других функций DE. И эта, результирующая функция DE является модулятором для других функций. Как то так.
Самым ярким примером гибридного фрактала является фрактал Pseudo Kleinian из библиотеки фрагментариума. Он же, по сути и самый интересный!
Посмотрите и разберитесь с этим фракталом самостоятельно. И Вы увидите, что ничего сложного нет. Главное - внедрить правильно DE одного фрактала в DE другого. Это самое трудное, но самое интересное и открывает широчайшие возможности для экспериментов. Для начала попробуем создать гибридный фрактал из губки менгера.
#include "DE-Raytracer.frag"

 
uniform int iters;  slider[0,9,100]
uniform float scale; slider[0,3,16]
uniform vec3 offset; slider[(0,0,0),(1,1,1),(1,1,1)]
 
 
float DE(in vec3 z)
{
for (int n = 0; n < iters; n++) {
 z = abs(z);
 if (z.x<z.y)z.xy = z.yx;
 if (z.x<z.z)z.xz = z.zx;
 if (z.y<z.z)z.yz = z.zy;
 z = z*scale - offset*(scale-1.0);
 if(z.z<-0.5*offset.z*(scale-1.0))z.z+=offset.z*(scale-1.0);
}	
return z*pow(scale,-float(iters));
}

2_2014-11-11.jpg


Теперь добавляем в скрипт функцию цилиндра. Добавляем выше функции менгера, DE цилиндра заменяем на другое название. Теперь имя функции цилиндра вписываем в функцию менгера. Для удобства вводим регулировку длины цилиндра.
#include "DE-Raytracer.frag"

 
uniform int iters;  slider[0,9,100]
uniform float scale; slider[0,3,16]
uniform vec3 offset; slider[(0,0,0),(1,1,1),(1,1,1)]
uniform float Scale_Shape; slider[0,1,10]
 
// Cylinder
float  SHAPE(vec3 z) {
float d = length(z);
d = min(d, length(z.yz)-0.5);
d=max(d,z.x-Scale_Shape); d=max(d,-z.x-Scale_Shape);
return d;}
 
 
 
float DE(in vec3 z)
{
for (int n = 0; n < iters; n++) {
 z = abs(z);
 if (z.x<z.y)z.xy = z.yx;
 if (z.x<z.z)z.xz = z.zx;
 if (z.y<z.z)z.yz = z.zy;
 z = z*scale - offset*(scale-1.0);
 if(z.z<-0.5*offset.z*(scale-1.0))z.z+=offset.z*(scale-1.0);
}	
return SHAPE(z)*pow(scale,-float(iters));
}

Теперь кликаем "Build" и ...ничего не изменилось? :nea:
Не торопитесь - уменьшите количество итераций менгера до 2.

3_2014-11-11.jpg


Вы увидите, что менгер теперь построен из нашего цилиндра! Что получилось? Мы функцией DE менгера промодулировали функцию DE цилиндра! То есть - создали гибридный фрактал! Что нам и требовалось! Покрутите настройки, поиграйте.
Интересно, не правда ли?

4_2014-11-11.jpg


Попробуем круглый тор и увеличим количество итераций менгера до 4. Покрутим ползунки. Вот такой интересный менгер у нас получился, построенный из тора.

5_2014-11-11.jpg

#include "DE-Raytracer.frag"

 
uniform int iters;  slider[0,9,100]
uniform float scale; slider[0,3,16]
uniform vec3 offset; slider[(0,0,0),(1,1,1),(1,1,1)]
uniform float Scale_Shape; slider[0,1,10]
 
/*
// Cylinder
float  SHAPE(vec3 z) {
float d = length(z);
d = min(d, length(z.yz)-0.5);
d=max(d,z.x-Scale_Shape); d=max(d,-z.x-Scale_Shape);
return d;}
*/
 
//Torus
float sdTorus( vec3 p, vec2 t ){
vec2 q = vec2(length(p.xz)-t.x,p.y)-1;
return length(q)-t.y;}
float SHAPE(vec3 z){
float d  = sdTorus(z,Scale_Shape);
return d;}
 
 
float DE(in vec3 z)
{
for (int n = 0; n < iters; n++) {
 z = abs(z);
 if (z.x<z.y)z.xy = z.yx;
 if (z.x<z.z)z.xz = z.zx;
 if (z.y<z.z)z.yz = z.zy;
 z = z*scale - offset*(scale-1.0);
 if(z.z<-0.5*offset.z*(scale-1.0))z.z+=offset.z*(scale-1.0);
}	
return SHAPE(z)*pow(scale,-float(iters));
}
 
#preset default
FOV = 0.62536
Eye = 0.897141,0.0999655,1.09362
Target = -5.26326,-0.57837,-5.24026
EquiRectangular = false
FocalPlane = 1
Aperture = 0
Gamma = 2.08335
ToneMapping = 3
Exposure = 0.6522
Brightness = 1
Contrast = 1
Saturation = 1
GaussianWeight = 1
AntiAliasScale = 2
Detail = -2.84956
DetailAO = -1.35716
FudgeFactor = 1
MaxRaySteps = 164
Dither = 0.51754
NormalBackStep = 1 NotLocked
AO = 0,0,0,0.85185
Specular = 1.6456
SpecularExp = 16.364
SpecularMax = 10
SpotLight = 1,1,1,1
SpotLightDir = 0.63626,0.5
CamLight = 1,1,1,1.53846
CamLightMin = 0.12121
Glow = 1,1,1,0.43836
GlowMax = 52
Fog = 0
HardShadow = 0.35385
ShadowSoft = 12.5806
Reflection = 0
DebugSun = false
BaseColor = 1,1,1
OrbitStrength = 0.14286
X = 1,1,1,1
Y = 0.345098,0.666667,0,0.02912
Z = 1,0.666667,0,1
R = 0.0784314,1,0.941176,-0.0194
BackgroundColor = 0.607843,0.866667,0.560784
GradientBackground = 0.3261
CycleColors = false
Cycles = 4.04901
EnableFloor = false
FloorNormal = 0,0,0
FloorHeight = 0
FloorColor = 1,1,1
scale = 3.81648
offset = 1,0.65455,0.64545
Scale_Shape = 0.2778
Up = 0,1,0
iters = 4
#endpreset

Очень интересно смотрится менгер, построенной из пружинок:
#include "DE-Raytracer.frag"

 
uniform int iters;  slider[0,9,100]
uniform float scale; slider[0,3,16]
uniform vec3 offset; slider[(0,0,0),(1,1,1),(1,1,1)]
uniform float Scale_Shape; slider[0,1,10]
 
float SHAPE(vec3 p){
float a = atan(p.y,p.x)*0.1;
float b = mod(p.z,0.6283)-0.314159;
a = abs(a-b);
if (a>0.314159) a = 0.6283-a;
return length(vec2(length(p.xy)-0.3, a))-Scale_Shape;}
 
 
float DE(in vec3 z)
{
for (int n = 0; n < iters; n++) {
 z = abs(z);
 if (z.x<z.y)z.xy = z.yx;
 if (z.x<z.z)z.xz = z.zx;
 if (z.y<z.z)z.yz = z.zy;
 z = z*scale - offset*(scale-1.0);
 if(z.z<-0.5*offset.z*(scale-1.0))z.z+=offset.z*(scale-1.0);
}	
return SHAPE(z)*pow(scale,-float(iters));
}
 
#preset default
FOV = 0.62536
Eye = 1.03618,0.0334754,1.23657
Target = -5.12422,-0.64486,-5.09731
EquiRectangular = false
FocalPlane = 1
Aperture = 0
Gamma = 2.08335
ToneMapping = 3
Exposure = 0.6522
Brightness = 1
Contrast = 1
Saturation = 1
GaussianWeight = 1
AntiAliasScale = 2
Detail = -2.84956
DetailAO = -1.35716
FudgeFactor = 1
MaxRaySteps = 164
Dither = 0.51754
NormalBackStep = 1 NotLocked
AO = 0,0,0,0.85185
Specular = 1.6456
SpecularExp = 16.364
SpecularMax = 10
SpotLight = 1,1,1,1
SpotLightDir = 0.63626,0.5
CamLight = 1,1,1,1.53846
CamLightMin = 0.12121
Glow = 1,1,1,0.43836
GlowMax = 52
Fog = 0
HardShadow = 0.35385
ShadowSoft = 12.5806
Reflection = 0
DebugSun = false
BaseColor = 1,1,1
OrbitStrength = 0.14286
X = 1,1,1,1
Y = 0.345098,0.666667,0,0.02912
Z = 1,0.666667,0,1
R = 0.0784314,1,0.941176,-0.0194
BackgroundColor = 0.607843,0.866667,0.560784
GradientBackground = 0.3261
CycleColors = false
Cycles = 4.04901
EnableFloor = false
FloorNormal = 0,0,0
FloorHeight = 0
FloorColor = 1,1,1
scale = 3.52288
offset = 1,0.66364,0.70909
Scale_Shape = 0.1389
iters = 3
Up = 0,1,0
#endpreset
Что следует отметить? В функции возврата менгера кроме вписанного примитива, присутствуют строки о шкале и итерациях. Для чего это? А для того, чтобы наш строительный материал из примитивов следовал за итерациями менгера, изменял пропорционально свой размер. Больше итераций - размер "кирпичиков меньше.

6_2014-11-11.jpg


Поэкспериментируйте с другими примитивами! Библиотека здесь под спойлером:
fractalus.ru/forum/fragmentarium/75-populyatsii-fraktalov#1441

В заключении создадим нормальный гибридный фрактал, не "примитивный"
Мы попробуем внедрить функцию DE мандельбульба в DE квантерниона и посмотрим, что получится.

1_2014-11-11.jpg

#include "DE-RaytracerG.frag"
#include "MathUtils.frag"

#group 4D Quaternion Julia
// Number of fractal iterations.
uniform int Iterations;  slider[0,16,100]
// Breakout distance
uniform float Threshold; slider[0,10,100]
// Quaterion Constant
uniform vec4 C; slider[(-1,-1,-1,-1),(0.18,0.88,0.24,0.16),(1,1,1,1)]
 
#group Mandelbulb 
uniform float Bailout;slider[0.0,0.1,2.0]
uniform float Power;slider[0.0,5,30]
uniform float IterationsB;slider[0.0,10,100]
uniform int ColorIterations;  slider[0,9,100]
uniform bool SphereInv; checkbox[false]
uniform bool Julia; checkbox[false]
uniform vec3 JuliaC; slider[(-2,-2,-2),(0,0,0),(2,2,2)]
uniform vec3 RotVector; slider[(0,0,0),(1,1,1),(1,1,1)]
uniform float RotAngle; slider[0.00,0,180]
 
uniform float time;
 
 
float bulb(vec3 pos) {
vec3 z = pos;
float dr = 1.0;
float r = 0.0;
      if (SphereInv) z/=dot(z,z);
     for (int i = 0; i < IterationsB; i++) {
 r = length(z);
     if (r>Bailout) break;  
 
 // convert to polar coordinates
 float theta = acos(z.z/r);
 float phi = atan(z.y,z.x);
 dr =  pow( r, Power-1.0)*Power*dr + 1.0;
 
 // scale and rotate the point
 float zr = pow( r,Power);
 theta = theta*Power;
 phi = phi*Power;
 mat3 rot;
 
rot = rotationMatrix3(normalize(RotVector), RotAngle+time*20.0);
 
 // convert back to cartesian coordinates
 z = zr*vec3(sin(theta)*cos(phi), sin(phi)*sin(theta), cos(theta));  
       z+=(Julia ? JuliaC : pos);
 r=length(z);
 z*=rot;
if (i<ColorIterations) orbitTrap = min(orbitTrap, abs(vec4(z.x,z.y,z.z,r*r)));
 i++;
}
return 0.5*log(r)*r/dr;
}
// The inline expanded quaterion multiplications make this DE
// look much worse than it actually is.
float DE(vec3 pos) {
float d=10000.0;
vec4 p = vec4(pos, 0.0);
vec4 dp = vec4(1.0, 0.0,0.0,0.0);
for (int i = 0; i < Iterations; i++) {
 dp = 2.0* vec4(p.x*dp.x-dot(p.yzw, dp.yzw), p.x*dp.yzw+dp.x*p.yzw+cross(p.yzw, dp.yzw));
 p = vec4(p.x*p.x-dot(p.yzw, p.yzw), vec3(2.0*p.x*p.yzw)) + C;
 float p2 = dot(p,p);
 //orbitTrap = min(orbitTrap, abs(vec4(p.xyz,p2)));
 float r = bulb(p.xyz);
 d=min(d,1.5 * r / length(dp));
 if (p2 > Threshold) break;
}
// length(p);
return d;// 0.5 * r / length(dp);
}
 
#preset default
FOV = 0.4
Eye = -1.74573,-1.1422,2.12617
Target = 3.21408,3.51164,-5.20472
EquiRectangular = false
FocalPlane = 1
Aperture = 0
Gamma = 2
ToneMapping = 4
Exposure = 1
Brightness = 1
Contrast = 1
Saturation = 1
GaussianWeight = 1
AntiAliasScale = 2
Detail = -3.21104
DetailAO = -0.5
FudgeFactor = 0.93671
MaxRaySteps = 345
Dither = 0.5 Locked
NormalBackStep = 1
AO = 0,0,0,0.48052
Specular = 1.5
SpecularExp = 82.353
SpecularMax = 10
SpotLight = 1,1,1,0.38043
SpotLightDir = -0.46666,-0.13334
CamLight = 1,1,1,1
CamLightMin = 0.27419
Glow = 1,0,0,0.15942
GlowMax = 75
Fog = 0
HardShadow = 0 NotLocked
ShadowSoft = 20
Reflection = 0.16216 NotLocked
DebugSun = false NotLocked
BaseColor = 1,1,1
OrbitStrength = 0.60274
X = 0.5,0.6,0.6,0.81818
Y = 1,0.6,0,0.75758
Z = 0.8,0.78,1,0.65656
R = 0.4,0.7,1,-0.36734
BackgroundColor = 0,0,0.498039
GradientBackground = 1.42855
CycleColors = false
Cycles = 11.1491
EnableFloor = false
FloorNormal = 0,0,0
FloorHeight = 0
FloorColor = 1,1,1
Bailout = 2
Power = 8
ColorIterations = 13
SphereInv = false
Julia = true
JuliaC = -0.16824,-0.01868,-1.32712
RotVector = 0.65217,0.83696,0.27174
RotAngle = 88.9164
IterationsB = 22.973
Iterations = 19
Threshold = 35
C = -1,0.5,0.625,0.03126
val = -0.24792
Up = 0,1,0
#endpreset

Строкой float r = bulb(p.xyz); в функции DE квантерниона вставлена функция мандельбульба. И теперь наш мандельбульб подчиняется законам DE квантерниона.
Всё, мы создали гибридный фрактал!
Теперь давайте экспериментировать и результаты выкладывать в этой теме. Хорошо?
Кому это надо?
- Никому не надо...
Кому это нужно?
- Никому не нужно...
Администратор запретил публиковать записи гостям.
Отлично! сказали: androceus, Alef

Гибридные фракталы 5 года 6 мес. назад #1648

  • Alef
  • Alef аватар
  • Вне сайта
  • Фракталю потихоньку
  • Сообщений: 133
  • Сказали Отлично!: 153
  • Репутация: 14
Ну очень круто. Последняя картинка похожа на жулиа сетов, которых в 2D получал отчитивая единичных векторов. Типа z=z*z+c ; z=z- 0.5* z/|z| Колбасный менгер то же неплох.
Как я понимаю, привычно чередовать формул, итерируем одну формулу, потом итерируем другую, как в Мандельбульбе, можно только с рейтресером без ДЕ?
Администратор запретил публиковать записи гостям.

Гибридные фракталы 5 года 6 мес. назад #1650

  • SCORPION
  • SCORPION аватар
  • Вне сайта
  • Модератор я...
  • Всё получилось, а никто не заметил...(
  • Сообщений: 530
  • Сказали Отлично!: 464
  • Репутация: 38
Alef пишет:
итерируем одну формулу, потом итерируем другую, как в Мандельбульбе, можно только с рейтресером без ДЕ?
Точнее - итерируем одну, потом эту, итерированную уже итерируем другой функцией. А вот без DE нельзя - эта функция внедрена практически во все рейтрейсеры фрагментариума, кроме грубого, кажется. Если DE нету - фрагментариум заорёт - "Где DE, давайте его сюда!" :lols:
Кому это надо?
- Никому не надо...
Кому это нужно?
- Никому не нужно...
Администратор запретил публиковать записи гостям.

Гибридные фракталы 5 года 6 мес. назад #1681

  • Alef
  • Alef аватар
  • Вне сайта
  • Фракталю потихоньку
  • Сообщений: 133
  • Сказали Отлично!: 153
  • Репутация: 14
Еще NODE Raytracer. www.fractalforums.com/fragmentarium/'nod...'-for-fragmentarium/ Не знаю, хороший, но его автор однозначно делал очень крутых картинок.
Администратор запретил публиковать записи гостям.

Гибридные фракталы 5 года 6 мес. назад #1685

  • SCORPION
  • SCORPION аватар
  • Вне сайта
  • Модератор я...
  • Всё получилось, а никто не заметил...(
  • Сообщений: 530
  • Сказали Отлично!: 464
  • Репутация: 38
Пробовал его. На версии 0.9.12b глючит и не все функции работают, на версии 1.0 и сборках работает только превью, но не глючит,как ни странно, а при рендере - чёрный экран.
Кому это надо?
- Никому не надо...
Кому это нужно?
- Никому не нужно...
Администратор запретил публиковать записи гостям.

Гибридные фракталы 5 года 2 мес. назад #2713

  • adminus
  • adminus аватар
  • Вне сайта
  • Администратор
  • consequat quis extralabile
  • Сообщений: 748
  • Сказали Отлично!: 544
  • Репутация: 17
Владимир, а можно ли "Гибридизировать" Pseudo Kleinian и Менгер, внедрив туда еще и итерируемые петли?
Вот, например, код, основанный на Knot и Soft - трейсере.
#info knot thingy by knighty (2012). Based on an idea by DarkBeam from fractalforums (http://www.fractalforums.com/new-theories-and-research/not-fractal-but-funny-trefoil-knot-routine/30/)
#include "Soft-Raytracer.frag"
#group Trefoil

 
//Radius of the tubes
uniform float tubeRadius; slider[0,0.1,0.5]
 
//Radius of the goup of tubes
uniform float groupRadius; slider[0,0.4,0.5]
 
//Radius of the whole object (because it looks like a torus (-:)
uniform float objectRadius; slider[0,1,1]
 
//Rotation Numerator X: actually not a rotation. This is frequency in x direction
uniform int    RotNumeratorX; slider[-10,2,10]
 
//Rotation Numerator Y: actually not a rotation. This is frequency in y direction. (lissajou figure)
uniform int    RotNumeratorY; slider[-10,4,10]
 
//Rotation Denominator: this is the rotation "speed" in xz plane
uniform int    RotDenominator; slider[1,3,20]
 
//Rotations number: how many instances to check. related to the period of the knot. Have to find math formula for that. 
uniform int    Rotations; slider[1,1,10]
 
float Cylinder(vec2 p){
	p.x-=groupRadius;
	return length(p)-tubeRadius;
}
 
float twist(vec3 p){//seen from above it is a lissajou fugure
	float ra =p.z*float(RotNumeratorX)/float( RotDenominator);
	float raz=p.z*float(RotNumeratorY)/float(RotDenominator);
	return length(p.xy-vec2(groupRadius*cos(ra)+objectRadius,groupRadius*sin(raz)+objectRadius))-tubeRadius;
}
 
vec3 bend2PI(vec3 p){
	return vec3(length(p.xz),p.y,atan(p.z,p.x));
}
 
float DE(vec3 p) {
	float r=length(p.xz), ang=atan(p.z,p.x),y=p.y;
	float d=10000.;
	for(int i=0; i<Rotations;i++){
		vec3 p=vec3(r,y,ang+2.*PI*float(i));
		p.x-=objectRadius;
		d=min(d,twist(p));
	}
	return min(d,p.y);
}

Кроме того, имеется вот такой код;
#define USE_EIFFIE_SHADOW
#include "DE-Raytracer.frag"
#include "QuilezLib.frag"
#group TestScene
uniform float TextureScale; slider[0,1,40]
 
float DE(vec3 p)
{	
       p.xy=p.yx;
	float d = length(p+vec3(0.0,0.0,-0.25))-0.25;   //  sphere
 
 
 
	return min(p.z,d);// distance estimate
}
описывающий сферу. Как ее размножить и довести до сотни итераций а после внедрить в Pseudo Kleinian или менгер?
consequat quis extralabile
Последнее редактирование: 5 года 2 мес. назад от adminus.
Администратор запретил публиковать записи гостям.

Гибридные фракталы 5 года 2 мес. назад #2714

  • SCORPION
  • SCORPION аватар
  • Вне сайта
  • Модератор я...
  • Всё получилось, а никто не заметил...(
  • Сообщений: 530
  • Сказали Отлично!: 464
  • Репутация: 38
Дмитрий, Вы всё время обращаетесь ко мне, хотя у нас есть Сергей, который с большим успехом делает комбинированные и гибридные фракталы!
1. Pseudo Kleinian и Менгер уже давно есть в библиотеке фрагментариума и лежит по пути Examples\Knighty Collection Если код запустить, в скрипте есть ссылка, можно сходить и узнать много интересного и потырить коды.... :gmr2:
www.fractalforums.com/3d-fractal-generat...u/msg32270/#msg32270

2. Вот здесь же, на фракталфоруме, Сергей сгибридил псевдо клейман и квантернион:
www.fractalforums.com/fragmentarium/frag...he-gpu/msg81547/#new

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]


Дмитрий, на этом примере уже легко сгибридить кнот и псевдо клейман.

3. Про размножение сферы я долго и нудно рассказывал тут:
fractalus.ru/forum/fragmentarium/75-populyatsii-fraktalov
Вот интересно, для кого?
Ну и внедрить всё это дело можно так же, как в штатном псевдо клеймане или клейман+квантернион Сергея.
Если будет время - завтра попробую...
Кому это надо?
- Никому не надо...
Кому это нужно?
- Никому не нужно...
Администратор запретил публиковать записи гостям.
Модераторы: SCORPION
Время создания страницы: 0.372 секунд
1. Erik_Wollo-Blue_Radiance Play
2. Astropilot_Solar Walk IV Play
3. GERMIND _ Cosmicleaf Records Series Vol.14 Play
4. Kyoto_-_Bodhisattva_(Original_Mix) Play
5. Play