tag:blogger.com,1999:blog-74845354166002560402024-03-13T09:47:17.357+01:00safina3dFor people who love 3D and ProgrammingUnknownnoreply@blogger.comBlogger13125tag:blogger.com,1999:blog-7484535416600256040.post-19734401039568615062019-10-31T01:11:00.017+01:002024-03-06T01:12:59.232+01:00Create your first C4D plugin<p>
The main purpose of this tutorial is to explain the process of creating Cinema 4D plugins. Object generator plugins (ObjectData) are a good starting point, as they are easy to understand and develop. This tutorial will show you how to create a <a href="https://en.wikipedia.org/wiki/Torus_knot" target="_blank">3D Torus Knot</a> generator from scratch using Python.
</p>
<p>
It's important to note that in real-world projects, plugin creation is not always straightforward. We often go through a prototyping phase by doing a POC (proof of concept) to check the feasibility of our idea. This allows us to quickly test and only after that, we can begin developing the plugin.
</p>
<br />
<iframe src="https://www.youtube.com/embed/bm03M_NbtFM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p class="mt-2">
The TorusKnot plugin for Cinema 4D allows you to generate splines in the shape of a torus knot. It uses the following mathematical properties to calculate the points of the spline:
</p>
<ul>
<li>The variable t, which defines the position of each point on the spline. This variable can range from MIN_T to MAX_T, with a T_STEP interval between each value used.</li>
<li>The radii R and r, which determine the general shape of the torus knot. R corresponds to KNOT_PARAM_R0, and r corresponds to KNOT_PARAM_R1.</li>
<li>The parameter n, which determines the number of turns of the spline. The higher this number is, the more turns the spline will have.</li>
</ul>
<p>By using these parameters, the TorusKnot plugin allows you to generate splines in the shape of a torus knot in a simple and fast way, offering many possibilities for creating complex 3D shapes in Cinema 4D.</p>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4SqKSxOqoK1Xk9n8eL1ntISC7kZzQgUjJM8U0UKvaxIEFm5XGe-Ulhdc6BY46dJdbNyOnVHHEIG1Rut2NecFRQ9GkgcWWixYzIPv6Gosi8TKBf9O_2Ir15mtYXm1c2RbLH5jvRKO8Cno/s1600/tk.png" />
<br><br>
<h4 class="mb-1">Some useful links</h4>
<ul>
<li><a href="https://www.mathcurve.com/courbes3d.gb/solenoidtoric/solenoidtoric.shtml">Toric solenoid</a></li>
<li><a href="https://developers.maxon.net/docs/Cinema4DPythonSDK/html/index.html" target="_blank">Python SDK documentation</a></li>
<li><a href="https://developers.maxon.net/docs/Cinema4DCPPSDK/html/page_description_resource.html#section_descriptionresource_namingconvention" target="_blank" >Description Resource</a></li>
<li><a href="https://developers.maxon.net/?page_id=3224" target="_blank" >How to get Plugin IDs ?</a></li>
<li><a href="https://developers.maxon.net/docs/Cinema4DPythonSDK/html/misc/pluginstructure.html" target="_blank" >Plugin Structure</a></li>
</ul>
<div class="plugin-toolbar mt-3">
<div class="plugin-toolbar__item">
<a href="http://bit.ly/2MZfWlV" rel="external">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path
d="M288 32c0-17.7-14.3-32-32-32s-32 14.3-32 32V274.7l-73.4-73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L288 274.7V32zM64 352c-35.3 0-64 28.7-64 64v32c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V416c0-35.3-28.7-64-64-64H346.5l-45.3 45.3c-25 25-65.5 25-90.5 0L165.5 352H64zm368 56a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"
/>
</svg>
Download
</a>
</div>
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-4704980136877649362019-10-07T08:34:00.003+02:002024-02-09T17:10:48.125+01:00Nes emulation using Thinking particles
<h3>Description</h3>
<p>The emulator has been developed solely for educational purposes at this stage.<br>Currently, it lacks sound functionality and requires substantial bug fixes.</p>
<div style="text-align:center">
<iframe src="https://www.youtube.com/embed/aR4UU3KjzT4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<p>More information soon...</p>
<p>Or, check out some classic games for Cinema 4D: <a href="/p/games4cinema.html">Games4Cinema</a>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-44987416378931564202019-10-02T03:53:00.013+02:002024-02-11T15:36:05.413+01:00How to install python 3rd party library in Cinema 4D ?<div>
<h3>Update (For R21 and +)</h3>
<pre>
1- Download https://bootstrap.pypa.io/get-pip.py.
2- Download the c4dpy version matching your Cinema 4D version. (Already included in R21 and +)
3- Move c4dpy and get-pip.py in the Cinema 4D folder.
4- Open a shell to the Cinema 4D folder:
|_ Window: Type cmd in the top path and press Enter.
|_ Mac: Open a new shell, then with cd navigate to your Cinema 4D folder. (You can drag and drop the path).
5- Run this command line c4dpy get-pip.py. This will execute the get-pip script which will, download and install the pip module.
6- Now you can start to play with pip c4dpy -m pip install pygame. c4dpy allow to runs any module with the -m argument see c4dpy commandline.
</pre>
Source: <a href="https://plugincafe.maxon.net/topic/11384/3rd-party-apis-into-pyp-pypv-file/2" alt="">plugincafe</a>
</div>
<br />
<br />
<div style="text-align:center;">
<iframe src="https://www.youtube.com/embed/a2I0UHxFZJE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<br />
<pre>
1- Go to Cinema 4D python's directory
2- If "pip" is not installed yet, download the get-pip.py file from https://bootstrap.pypa.io/get-pip.py
3- Install pip (command line): .\python get-pip.py
4- Install pygame : .\python -m pip install pygame
</pre>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-83764422447029692602019-03-26T07:40:00.002+01:002024-02-09T14:25:49.694+01:00Measure the execution time of a script<p>
Sometimes we have to choose between several algorithms that have the same goal. Performance and therefore the execution time can be considered as a good criterion, although there are many others.
For that the best solution would be to use a profiling tool, but if you want a quick solution we can simply calculate the difference of time between the beginning and the end of each algorithm.
</p>
<p>
In python, for ease and clarity of use, we can write this as a custom decorator and call it anywhere in our script.
</p>
<p>
To use this decorator :
<ol>
<li> Add the following snippet to your source code</li>
<li> Add the <strong>@measure()</strong> annotation above the function's signature that you want to test</li>
</ol>
</p>
<br/>
<pre>
def measure(iterations=1):
"""
This decorator allows you to print the average execution time of a function
:param iterations: number of times that function will be called
"""
import time
def decorator(fn):
def wrapper(*args, **kwargs):
_sum = 0.0
_result = None
for i in xrange(iterations):
_start = time.time()
_result = fn(*args, **kwargs)
_sum += time.time() - _start
print '"%s" Function called %s time(s). Average execution time: %f sec' % (fn.__name__, iterations, _sum / iterations)
return _result
return wrapper
return decorator
</pre>
<br/><br/>
<h4>Example</h4>
<pre>
@measure()
def my_function():
...
</pre>
<br/>
<p>The tested function is called once, but we can increase the number of iterations to get a more precise value. this can be achieved by changing the value of the decorator's argument</p>
<pre>
@measure(1000)
def my_function():
...
</pre>
<br/><br/>
<h4>Example of use</h4>
<p>Let's say we have a scene containing 2000 different objects and we want to sort them (in the object manager) by type, and by name (if they have the same type).</p>
<p>In the following source code we test 3 sorting algorithms:
<ul>
<li> Python default sort algorithm (<a href="https://en.wikipedia.org/wiki/Timsort" target="_blank">Timsort</a>) </li>
<li> The Insertion sort </li>
<li> The Bubble sort </li>
</ul>
the goal is to know which one is the fastest.
</p>
<pre>
import c4d
def measure(iterations=1):
"""
This decorator allows you to print the average execution time of a function
:param iterations: number of times that function will be called
:return: fn
"""
import time
def decorator(fn):
def wrapper(*args, **kwargs):
_sum = 0.0
_result = None
for i in xrange(iterations):
_start = time.time()
_result = fn(*args, **kwargs)
_sum += time.time() - _start
print '"%s" Function called %s time(s). Average execution time: %f sec' % (fn.__name__, iterations, _sum / iterations)
return _result
return wrapper
return decorator
def gt(a, b):
""" Checks that A value is greater than B """
type_a = a.GetType()
type_b = b.GetType()
if type_a == type_b:
return a.GetName() > b.GetName()
return a.GetType() > b.GetType()
def insertion_sort(array):
""" This function allows you to sort an array using the insertion sort algorithm """
count = len(array)
for i in xrange(count):
current_value = array[i]
pos = i
while pos > 0 and gt(array[pos - 1], current_value):
array[pos] = array[pos - 1]
pos = pos - 1
array[pos] = current_value
return array
def bubble_sort(array):
""" This function allows you to sort an array using the bubble sort algorithm """
def swap(a, b):
array[a], array[b] = array[b], array[a]
count = len(array)
swapped = True
idx = -1
while swapped:
swapped = False
idx = idx + 1
for i in xrange(1, count - idx):
if gt(array[i - 1], array[i]):
swap(i - 1, i)
swapped = True
return array
def _cmp(obj_a, obj_b):
return cmp(obj_a.GetType(), obj_b.GetType()) or cmp(obj_a.GetName(), obj_b.GetName())
def update_manager(doc, object_list):
""" Updates all objects position in the object manager """
doc.StartUndo()
for obj in object_list:
doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
obj.Remove()
doc.InsertObject(obj, None, None)
doc.EndUndo()
@measure()
def main():
obj = doc.GetFirstObject()
if not obj: return
objects = [obj]
obj = obj.GetNext()
while obj:
objects.append(obj)
obj = obj.GetNext()
# Default sorting
objects.sort(cmp=_cmp)
# Insertion sorting
# objects = insertion_sort(objects)
# Bubble sorting
# objects = bubble_sort(objects)
objects.reverse()
update_manager(doc, objects)
c4d.EventAdd()
if __name__ == '__main__':
main()
</pre>
<br/>
<h4>The results</h4>
<div style="text-align:center;">
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-eeiSuacP4cFxZ9K_P19kzmoVyEWKPzp2HV-9quIyC-zfnPTQYxzI8tf3m3AOq93TCuji26DY-tIYwEMei2OwoZmyX1ZIZX5X63BikXTbQ9o3KQGw9C_r_w4bHyq36N9qDUSbVdskmnk/s1600/result.png" />
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-89537403343489727112018-01-26T22:54:00.007+01:002024-02-09T16:10:13.127+01:00Random Vertex Color<p>
<strong>RandomVertexColor</strong> is a python script for Cinema R18 and higher, which allows you to assign random color to connected vertices using the new Vertex Color Tag. I did this script very quickly, the implementation may be a little "naive". I'll try to make some optimizations next time.
</p>
<p>This script will use the vertex color tag associated with the selected object, otherwise a new one is created. Afterwards, a random color is applied on every connected vertices chunk</p>
<br/>
<h3>How to use ?</h3>
<ul>
<li>Select your object</li>
<li>Execute RandomVertexColor script by choosing it from the script menu or pressing the Execute button if you use the script manager</li>
</ul>
<br />
<br/>
<div style="text-align:center;">
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMH8MZwr734fLLLiFLmXa7yhvdVXaTauziTXkEkMa2BdMx7WL5feaQBMSUFdvrpT5yZhpAGALZHkk_7KGrh0qrQTNa4Woyasc670-ycQvRaBdSrw2nPyhAqIWp5aF9z8Bw64GDKHOttWk/s1600/figure.png" alt="c4d random vertex color figure" />
</div>
<div class="plugin-toolbar">
<div>
<a href="https://gumroad.com/l/mwChy" rel="external">
<i aria-hidden="true" class="fa fa-download"></i>
<p>Download</p>
</a>
</div>
<div>
<a href="https://github.com/safina3d/c4d-random-vertex-color/" rel="external" target="_blank">
<i aria-hidden="true" class="fa fa-github"></i>
<p>Source code</p>
</a>
</div>
</div>
<br/>
<pre>
# -*- coding: utf-8 -*-
# Author: safina3d
# Website: safina3d.blogspot.com
# Version: 1.1
# Description: Assign random color to connected vertices using Vertex Color Tag
import c4d
from c4d import utils, Vector, BaseContainer
from random import randint
def get_random_color():
""" Return a random color as c4d.Vector """
def get_random_value():
""" Return a random value between 0.0 and 1.0 """
return randint(0, 255) / 256.0
return Vector(get_random_value(), get_random_value(), get_random_value())
def get_connected_polygons(obj, remaining_polygons):
# type: (PolygonObject, List[int]) -> List[int]
bs = obj.GetPolygonS()
bs.DeselectAll()
bs.Select(remaining_polygons[0])
utils.SendModelingCommand(command=c4d.MCOMMAND_SELECTCONNECTED,
list=[obj],
mode=c4d.MODELINGCOMMANDMODE_POLYGONSELECTION,
bc=BaseContainer(),
doc=doc)
result = []
for polygon_index in remaining_polygons:
if bs.IsSelected(polygon_index):
result.append(polygon_index)
return result
def polygons_to_vertices(op, polygon_list):
# type: (BaseObject, List[int]) -> List[int]
vertices = []
for polygon_index in polygon_list:
pts = op.GetPolygon(polygon_index)
vertices += [pts.a, pts.b, pts.c, pts.d]
return list(set(vertices))
def get_chunks(op, remaining_polygons):
# type: (BaseObject, List[int]) -> List[List[int]]
result = []
while len(remaining_polygons) > 0:
connected_polygons = get_connected_polygons(op, remaining_polygons)
result.append(polygons_to_vertices(op, connected_polygons))
remaining_polygons = list(set(remaining_polygons).difference(connected_polygons))
return result
def main():
if op is None:
return
if op.GetType() != c4d.OBJECT_POLYGON:
return
vertex_color_tag = op.GetTag(c4d.Tvertexcolor)
if vertex_color_tag is None:
vertex_color_tag = c4d.VariableTag(c4d.Tvertexcolor, op.GetPointCount())
op.InsertTag(vertex_color_tag)
doc.SetActiveTag(vertex_color_tag)
data = vertex_color_tag.GetDataAddressW()
remaining_polygons = list(range(op.GetPolygonCount()))
chunks = get_chunks(op, remaining_polygons)
for chunk in chunks:
color = get_random_color()
for vertex in chunk:
c4d.VertexColorTag.SetColor(data, None, None, vertex, color)
c4d.EventAdd()
if __name__ == '__main__':
main()
</pre>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-73389210063267895122018-01-01T06:38:00.005+01:002024-02-09T16:56:45.032+01:00Game of life<p>Another programming classic : <a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank">Game Of Life (Cellular Automata family)</a>.</p>
<p>Game of life is not a game and has nothing to do with life. but where it gets interesting, is in the fact that you can build complexe patterns whith different behaviours only with very simple rules.</p>
<p>The original Game of life rules (for a 2D space) are:</p>
<ul>
<li>Each cell with one or no neighbors dies, as if by solitude.</li>
<li>Each cell with more than three neighbors dies, as if by overpopulation.</li>
<li>Each cell with two or three neighbors survives.</li>
<li>Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.</li>
</ul>
<p>
In this script (Xpresso python node) I tried to create 3D version of Game of life with the possibility to have dynamic rules. You can start with some rules and change them right in the middle of your simulation.
</p>
<p>
It's a is time based animation. Every frame, new calculations are done and there is no bounderies for your final shape. as far as your rules allows expansion of your pattern and your PC can handle it :)
</p>
<a href="http://bit.ly/2CzL84j"><i class="fa fa-arrow-circle-o-right" aria-hidden="true"></i> Download Game of life project file</a>
<br/>
<br/>
<div style="text-align: center;"><iframe src="https://www.youtube.com/embed/o-CKyVY4ZTk" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe></div>
<br/>
<p>To create your own simulation, you have to :</p>
<ol>
<li>Define a set of starting points (see <strong>fill_grid</strong> method in source code)
<li>Set up your simulation rules</li>
<li>Press play button to start simulation</li>
</ol>
<br/>
<div style="text-align: center;"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb4_nV8WgDKxb7mGSUo0hdl_dXw4BIt7Q_flpeqCsspyRSO_tV0aiTo9Znzkz8qsVQTcEoSfF5U2esaZsrGTbkCp2dwJQCs_Ee9Fa7sd_OO-eiDvK7M-8u5hVrmr41Q-HaAAImzrLcQL8/s1600/gol.png" alt="Game of life"/></div>
<br/>
<h3>Source code</h3>
<pre><code class="python">
import c4d
from c4d import documents, Vector
from collections import defaultdict
class MultidimensionalDictionary:
def __init__(self):
self.cells = defaultdict(lambda: defaultdict(dict))
def get_value(self, i, j, k):
if self.cells.has_key(i) and self.cells[i].has_key(j) and self.cells[i][j].has_key(k):
return self.cells[i][j][k]
return None
def set_value(self, i, j, k, value):
self.cells[i][j][k] = value
return self
def for_each(self, fn):
for ikey, ivalue in self.cells.items():
for jkey, jvalue in ivalue.items():
for kkey, kvalue in jvalue.items():
fn(kvalue, ikey, jkey, kkey)
class Helper:
@staticmethod
def create_dict():
return defaultdict(lambda: defaultdict(dict))
@staticmethod
def for_each(array, fn):
for value in array:
fn(value)
@staticmethod
def loop_around(i, j, k, fn):
for a in xrange(i - 1, i + 2):
for b in xrange(j - 1, j + 2):
for c in xrange(k - 1, k + 2):
if (a, b, c) != (i, j, k):
fn(a, b, c)
@staticmethod
def fill_grid(generation):
"""
Place here your points coordinates
"""
init_points = [(-1, 0, 0), (1, 0, 0), (0, 0, 1), (0, 0, -1), (0, 1, 0), (0, -1, 0)]
for p in init_points:
generation.grid.set_value(p[0], p[1], p[2], Cell())
class Cell:
def __init__(self, age=1):
self.age = age
class Generation:
def __init__(self):
self.grid = MultidimensionalDictionary()
def get_cells_count_around(self, i, j, k):
counter = 0
for a in xrange(i - 1, i + 2):
for b in xrange(j - 1, j + 2):
for c in xrange(k - 1, k + 2):
if self.grid.get_value(a, b, c):
counter += 1
return counter - 1 if self.grid.get_value(i, j, k) else counter
def get_next_generation(self):
""" Get next cells generation """
new_generation = Generation()
def birth(i, j, k):
""" Checks if a new cell can be born """
current_cell = self.grid.get_value(i, j, k)
if current_cell is None:
count = self.get_cells_count_around(i, j, k)
if birth_min <= count <= birth_max:
new_generation.grid.set_value(i, j, k, Cell())
def update_cell(selected_cell, i, j, k):
""" Checks if the current cell can survive """
count = self.get_cells_count_around(i, j, k)
if survival_min <= count <= survival_max:
selected_cell.age += 1
new_generation.grid.set_value(i, j, k, selected_cell)
Helper.loop_around(i, j, k, birth)
self.grid.for_each(update_cell)
return new_generation
class C4dRender:
SCALE_COEF = 1
OLDEST_CELL_AGE = 0
def __init__(self):
self.generation = Generation()
self.doc = documents.GetActiveDocument()
self.tp = self.doc.GetParticleSystem()
self.root_group = self.tp.GetRootGroup()
Helper.fill_grid(self.generation)
def update(self):
self.tp.FreeAllParticles()
self.generation.grid.for_each(self.render)
c4d.EventAdd()
self.generation = self.generation.get_next_generation()
def render(self, cell, i, j, k):
C4dRender.OLDEST_CELL_AGE = cell.age if cell.age > C4dRender.OLDEST_CELL_AGE else C4dRender.OLDEST_CELL_AGE
# drawing particle
p = self.tp.AllocParticle()
self.tp.SetGroup(p, self.root_group)
self.tp.SetPosition(p, Vector(i, j, k) * C4dRender.SCALE_COEF)
self.tp.SetSize(p, cell.age * 0.5)
self.tp.SetColor(p, Vector(c4d.utils.RangeMap(cell.age, 0, C4dRender.OLDEST_CELL_AGE, 0, 1, True), 0.2, 0.4))
instance = C4dRender()
def main():
if frame % refresh == 0:
instance.update()
</code></pre>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-12726663210333008302017-11-27T16:31:00.004+01:002024-02-09T14:04:26.809+01:00Minesweeper<div style="clear: both;">
<br />
Cinema 4D gives us a 3D engine, Objects, Gui and some programming languages.. that's all what we need to create some games.. of course there is some limitations, but it still possible.
</div>
that's why i developped a classic game "Minesweeper". The first of a long series (I hope...) of #Games4Cinema
<br />
This script is a draft, it still needs some features like placing flags or option menu etc...
<br />
<br />
Enjoy :)
<br />
<br />
<div style="text-align: center;">
<img alt="minesweeper default" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMfNg2d5EbTpYJmpizFsk1zWnoSaEQZEf77lz1Pq2HUxqcbEB5_lBEhvTZBqQiCrODNOWAo220EQ921W45ts0RrQWY2mqsnccOvEmubrG54SJN9AJ3yVjzFQKhVBeWKgO67oBiboaVMFA/s1600/minesweeper.png" />
<img alt="minesweeper gameover" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWWw6QG-RBI_Lkf-22pMRpNcq1nhmiqyvHqyAUk5yAk2gv5wb9HwN2oeX5K_ahTR2wjyjcQLLP80BzCbT5zAFJ4qRgrjpMS4OXBwrOkZ5MuZT4ZXNy8QPwg8HPK7ZkOZPVqdqHO9mz29Y/s1600/minesweeper2.png" />
</div>
<br />
<h3>
Installation</h3>
<ul>
<li>Clone the project or download the zip file and extract it into the Maxon scripts directory.
<ul>
<li><span style="display: inline-block; width: 5rem;">Windows</span><span class="code">C:\Program Files\MAXON\CINEMA 4D R<version>\library\scripts\</span></li>
<li><span style="display: inline-block; width: 5rem;">MacOs</span><span class="code">/Applications/MAXON/CINEMA 4D R<version>/library/scripts/</span></li>
</ul>
</li>
<li>Restart Cinema 4D</li>
<li>Open Cinema 4D Menu</li>
<ul>
<li>Script » User scripts » Minesweeper » minesweeper</li>
</ul>
</ul>
<br />
<pre><code class="python">
# You can change the size of the grid and difficulty by changing the values passed to the `MinesweeperGui` object.
# The args are: Rows, Columns, Difficulty[EASY|MEDIUM|DIFFICULT]
if __name__ == '__main__':
dlg = MinesweeperGui(15, 10, Level.EASY)
dlg.Open(dlgtype=c4d.DLG_TYPE_ASYNC)
</code></pre>
<div class="plugin-toolbar">
<div>
<a href="http://bit.ly/2AGvFkW" rel="external">
<i aria-hidden="true" class="fa fa-download"></i>
<p>Download</p>
</a>
</div>
<div>
<a href="https://github.com/safina3d/c4d-minesweepr" rel="external" target="_blank">
<i aria-hidden="true" class="fa fa-github"></i>
<p>Source code</p>
</a>
</div>
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-55578378249701672832012-04-06T00:19:00.003+02:002024-02-09T16:47:20.055+01:00zManipulator v1.0b<p>zManipulator v1.0b is a versatile plugin developed to facilitate object manipulation within various workflows. This tool provides users with the ability to execute Move, Rotate, and Scale operations seamlessly through a unified tool.</p>
<h4>Beta Version</h4>
<p>Please note that zManipulator v1.0b for C4D R13 is currently in beta status. Users may encounter occasional bugs or glitches.</p>
<h3>Usage</h3>
<p>To utilize zManipulator:</p>
<ul>
<li>Install the plugin in your preferred environment.</li>
<li>Access the Move, Rotate, and Scale functionalities through the provided interface.</li>
<li>For precise axis alignment, hold the Ctrl key and perform a Left Mouse click on the desired vertex. To recenter the axis, hold Ctrl and click in an empty space.</li>
</ul>
<br />
<a href="http://www.mediafire.com/?66nx5ml75bdhbpz" target="_blank">Download zManipulator v1.0b</a><br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" src="http://www.youtube.com/embed/27X5EdljFhU"></iframe></div>
<br />
hope you'll find it useful!<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-28782026590188358372012-02-01T00:35:00.006+01:002024-02-09T17:35:27.439+01:00flipPoZ v1.0b<p>FlipPoz is a C4D plugin developed to simplify the process of mirroring poses in animations.</p>
<h4>Description</h4>
<p>During the creation of walk cycle animations, there's often a need to mirror poses, which traditionally involves manual copying and pasting. To address this inefficiency, flipPoz was developed to automate the mirroring process with a single click.</p>
<br/>
<h4>Compatibility</h4>
<p>flipPoz is compatible with the Character tool (r13).</p>
<br/>
<h4>Features</h4>
<p>flipPoz offers the following features:</p>
<ul>
<li>Instant mirroring of the current pose.</li>
<li>Copying the current pose to the opposite side.</li>
<li>Selecting the corresponding controller for the mirrored pose.</li>
</ul>
<br />
<a href="http://www.mediafire.com/?a2gvjz5ggmo6rc3" target="_blank">Download flipPoz</a><br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" src="http://www.youtube.com/embed/1APLTmwchPY"></iframe>
</div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-7472623946258088812011-10-26T05:28:00.002+02:002024-02-09T17:16:08.750+01:00XPresso, Wheel animation<p>This tutorial is a simple introduction to Xpresso and Thinking Particles.</p>
<p>Project file <a href="http://dl.dropbox.com/u/30974024/Tutos/Wheel.zip"><i class="fa fa-arrow-circle-o-right" aria-hidden="true"></i> wheel.zip</a></p>
<br />
<div class="video-container">
<h4>Part I</h4>
<iframe src="https://player.vimeo.com/video/31119546" frameborder="0" allowfullscreen></iframe>
</div>
<div class="video-container">
<h4>Part II</h4>
<iframe allowfullscreen frameborder="0" src="https://player.vimeo.com/video/35168681"></iframe>
</div>
<p>Render test</p>
<div class="video-container">
<iframe allowfullscreen frameborder="0" src="//player.vimeo.com/video/30772198"></iframe>
</div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-76827242660994781442011-10-13T00:15:00.002+02:002024-02-09T14:26:20.365+01:00zPoulette<br />
<a href="http://www.mediafire.com/?uao699jbm6b295z">download zPoulette for C4D R13/R14 only</a>
<br />
<div class="video-container">
<iframe allowfullscreen="" frameborder="0" src="//www.youtube.com/embed/Ae0a6iczMP8"></iframe>
</div>
<br />
<div style="text-align: center;">
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA1x4lhf3a9AyHSGYa-NL7JdATQFABbVb1jNeRQkrEodlpi0pAI872Yz7wGkD2I6RYTjH78w23D5TVF8nZwD0IKGoj-AXm8xWHhW54Pim7Q55vsd-rS60tNt2IoogrXNUJRBrfDvqwyPuj/s640/d.png" width="580" />
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-60036407446125692362011-05-02T01:33:00.005+02:002024-02-09T16:58:29.297+01:00Cel Shading without Sketch & Toon<center><iframe src="//player.vimeo.com/video/23127196?loop=1" frameborder="0"></iframe><p><a href="//vimeo.com/23127196">Quick Tip #01 : Toon in C4d ?</a> from <a href="http://vimeo.com/user2890137">safina3D</a> on <a href="http://vimeo.com">Vimeo</a>.</p></center>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7484535416600256040.post-48962190306946360872010-12-23T17:04:00.005+01:002024-02-09T13:40:10.686+01:00Creating a Rain setup with Thinking Particles<div class="video-container">
<iframe frameborder="0" src="//player.vimeo.com/video/18121111?loop=1"></iframe>
<div style="text-align: center;">
<a href="http://vimeo.com/18121111">Cinema 4D : Rain Test #01</a> from <a href="http://vimeo.com/user2890137">safina3d</a> on <a href="http://vimeo.com/">Vimeo</a>.<br />
</div>
</div>
<h4>Tutorial</h4>
<div class="video-container">
<iframe frameborder="0" src="//player.vimeo.com/video/18310667?loop=1"></iframe>
<div style="text-align: center;">
<a href="http://vimeo.com/18310667">Tutorial : Rain with Thinking Particles</a> from <a href="http://vimeo.com/user2890137">safina3d</a> on <a href="http://vimeo.com/">Vimeo</a>.
</div>
</div>
<h4>Ripple effect</h4>
<div class="video-container">
<iframe allowfullscreen="" frameborder="0" src="//www.youtube.com/embed/0hJ7bgpUMNA"></iframe>
</div>
<div>
<a href="http://bit.ly/2kYNBgo"><i class="fa fa-arrow-circle-o-right" aria-hidden="true"></i> Download the project file</a>
</div>
Unknownnoreply@blogger.com