Salut,
J'ai un objet comportant un nuage de points, sans polygones, et un objet comportant un lot de segments de splines.
Connaîtriez-vous un moyen de rendre chaque point et spline avec des couleurs différentes définies ?
J'étais parti sur Hair avec un tag Couleur de point, mais tous mes points et splines se retrouvent avec la même couleur :
Pas bon
Dernière modification par César Vonc ; 22/03/2019 à 21h45.
salut,
je sais pas si ça peut faire la blague
PointsSplinesMorgaph.c4d
Merci, c'est intéressant mais beaucoup trop lourd comme solution dans le cas où j'ai plusieurs millions de points.
Je dois impérativement garder un objet de milliers de points plutôt que plusieurs milliers d'objets d'un point, pour des raisons de performance.
ah oui effectivement
l'idée c'est vraiment d'utiliser les couleurs spécifiques venant de ton vertex color tag ?
sinon pourquoi ne pas mettre directement un gradient ou autre dans la couleur
PointsSplinesHairRandom.c4d
je n'ai aucune solution pour toi mais je veux bien voire la scène finale, plusieurs millier de point ça interpelle.
Semi-nudistes Marathoniens et Campagnards
Absent, quand je ne suis pas là.
Merci aux modos pour tout et tous.
Giloo: Sauf que la couleur est aléatoire, or j'ai besoin de la définir de manière précise.
Ce sont des coordonnées cartographiques sur un globe terrestre.
c'est bien ce que je pensais , tes données c'est des maps ? ou une série de chiffre, elles se présentent comment
Ce sont des données CSV, mais peu importe, je peux les transformer en carte d'influence ou autre chose s'il faut.
Actuellement j'ai pu "résoudre" le problème pour les points : au lieu de générer un nuage de points, je génère un nuage de minuscules triangles dont chaque point a la couleur qu'il faut via la propriété Couleur de point.
Et là Hair daigne enfin prendre en compte les couleurs de points ! Je dois juste définir une longueur de cheveux de 0.001%, mais pas nul, pour avoir un affichage de points.
C'est pas terrible mais ça passe
Pour les splines, je n'ai pas encore de solution.
Et pourquoi pas transformer tes points en particules (régler pour générer une particule par point.) et transférer les couleur de la sphère avec le map sur les particules.
x-particles fait ça et je crois que même TP le fait il me semble.
J'ai tenté l'approche avec les particules, mais je ne comprends absolument rien aux particules de C4D. Je demanderai au client s'il possède X-particules, bien que ça m'ennuie d'avoir à dépendre d'un plugin externe qui coûte vraiment cher.
Sais-tu comment afficher des particules de couleurs définies, avec ceux de base de C4D ?
Dire que l'affichage de points colorés est une fonctionnalité hyper basique en OpenGL, c'est fou que ce soit si complexe à faire dans C4D !
Dernière modification par César Vonc ; 24/03/2019 à 21h26.
Salut avec les particules standards je ne pense pas que tu puisses attacher des couleurs, cependant avec TP pas de soucis (tu peux voir une ébauche ici https://frenchcinema4d.fr/showthread...aderData-et-TP) et je te transmets un example demain pour créer des TP particles et définir pos+couleur en python
Après sinon tu peux directement draw dans le viewport et faire un rendu hardware non?
Et enfin tu peux aussi directement draw mais la c'est clairement sous documenté(voir pas dutout documenté) https://github.com/PluginCafe/cinema...est_object.cpp
Dernière modification par gr4ph0s ; 24/03/2019 à 23h03.
SDK Specialist
MAXON Computer GmbH
J'avais tenté avec des TP, je m'étais fait un mémo à l'époque de la R13 avec un script quasi identique au tien (https://code.vonc.fr/?a=35) mais ça reste des particules qui sortent un peu de nulle part, je ne trouve pas comment facilement les manipuler, je n'arrive même pas à les supprimer via le gestionnaire de TP, mais quelle horreur ce truc...
Je vois dans ton exemple que tu associes un cube à chaque particule (chose que je n'arrive pas non plus à faire avec mes TP générés en Python), mais cette solution est trop gourmande, il me faudrait un rendu qui ne nécessite pas la création d'objet polygonal pour chaque particule.
Ouais avec le Draw c'est "plus simple", mais devoir générer une passe de rendu logiciel en plus du rendu complet n'est vraiment pas pratique pour l'utilisateur. Il s'agit ici de simplement afficher des points de couleur sur la Terre.
Je penche aussi du côté de Sketch & Toon, mais je ne trouve pas comment dire à un matériau Sketch d'utiliser la couleur de la propriété Couleur de point.
Lev probleme avec TP c'est que si tu as 1 million de pts ca va mettre c4d a genou.
Sinon je pense a un truc plus simple. Si les point de ta catographie ne sont pas animé tu pourrai simplement mettre un masque de pointillé, dans le channel alpha. Comme la sphere portera aussi le map de couleur elle pourra aussi servir a colorer tes hairs.
Sinon x-particule ils sont passé en mode abonnement. pour un mois ca doit pas couter tres cher, et l'operation est tres simple.
il y a un champ dedié sur l'emitter pour le map qui colorise les particules.
Dernière modification par Floc ; 24/03/2019 à 23h14.
Effectivement comme tu le signale Floc, l'une des limitations des TP sont leur nombre.
Il y a aussi le fait que tu devras probablement passer par un objet qui load ton fichier, vu que lorsque tu crés des particules, elle existe mais si tu reviens à l'instant 0 elle n'existe plus.
Donc voici, sinon tu peux passer par les InstanceObjects (R20)Code:import c4d def main(): # Retrieves the Particles System of the current document pSys = doc.GetParticleSystem() if pSys is None: raise RuntimeError("op is none, please select one object.") # Retrieves the Root group (where all particles belongs as default) rootGrp = pSys.GetRootGroup() if rootGrp is None: raise RuntimeError("Failed to retrieves root group of tp master system.") # Allows each particles to get a custom colors rootGrp[c4d.PGROUP_USE_COLOR] = False # Creates 90 Particles particlesIds = pSys.AllocParticles(90) if not particlesIds: raise RuntimeError("Failed to creates 90 TP particles.") # Assigns position and colors for each particles for particleId in particlesIds: # Checks if particles ID is ok if particleId == c4d.NOTOK: continue # Calculates a position sin, cos = c4d.utils.SinCos(particleId) pos = c4d.Vector(sin * 100.0, cos * 100.0, particleId * 10.0) # Assigns position pSys.SetPosition(particleId, pos) # Calculates a color hsv = c4d.Vector(float(particleId) * 0.05, 1.0, 1.0) rgb = c4d.utils.HSVToRGB(hsv) # Assigns color pSys.SetColor(particleId, rgb) # Updates Cinema 4D c4d.EventAdd() if __name__ == "__main__": main()
Code:import c4d def main(): # Creates a matrix and a sphere object matrix = c4d.BaseObject(1018545) sphere = c4d.BaseObject(c4d.Osphere) # If the matrix or the sphere object is not created if matrix is None or sphere is None: raise RuntimeError("Failed to creates a matrix object or a sphere.") # Inserts theses 2 objects in the current document. doc.InsertObject(matrix) doc.InsertObject(sphere) # Creates an instance object instance = c4d.InstanceObject() if instance is None: raise RuntimeError("Failed to creates an instance object.") # Inserts the instance object in the active document doc.InsertObject(instance, None, None) # Defines the reference object to be instanced. instance.SetReferenceObject(sphere) # Defines the matrix object as input position object. instance[c4d.INSTANCEOBJECT_MULTIPOSITIONINPUT] = matrix instance[c4d.INSTANCEOBJECT_RENDERINSTANCE_MODE] = c4d.INSTANCEOBJECT_RENDERINSTANCE_MODE_MULTIINSTANCE # Updates Cinema 4D c4d.EventAdd() if __name__ == '__main__': main()
SDK Specialist
MAXON Computer GmbH
Ouch, si TP rame avec beaucoup de point, ça ne va pas m'aller non plus.
Si je comprends bien Floc, pour le masque en pointillé, ça sous entend de créer une texture potentiellement très grande si on veut des points fins ?
J'ai testé le nouveau type d'instance de la R20, Graphos, mais avec "seulement" 100 000 instances de petite sphère, C4D est complètement dans les choux, or j'aurai potentiellement un million d'objets.
Avec un test en WebGL et un shader personnalisé, j'ai facilement pu afficher beaucoup de points en temps réel sans aucun souci de performance (ici avec deux millions de points et de traits) :
Du coup je regarde du côté du shader de C4D, mais ça ne me semble pas très bien documenté ni avec beaucoup d'exemples, il faudrait là carrément faire une sorte de mini moteur de rendu, un peu comme fait TurbulenceFD pour afficher sa fumée, non ?
Dernière modification par César Vonc ; 29/03/2019 à 22h24.
Pour la version masque il te suffit d'avoir un pointillé qui tile correctement, du coup ils peuvent être aussi fins que tu veux.
Par contre maintenant que j'y pense a moins de faire un depliage et d'avoir deux sets d'uvs ca va déconner au poles
Sinon t'avais pas une mosaique a faire au lieu de bosser sur des truc sérieux ?
Dernière modification par Floc ; 29/03/2019 à 23h26.
Bon j'ai pas pu m'empecher de verifier la solution map !
Selon, ça peu le faire. Pour les pole ca peu ne pas etre genant, le plus genant je trouve c'est du coté de la france ou les point commence a s'etirer un peu. Et en general en france quand on te demande une planete il faut souvent se rapprocher de la france justement.
L'avantage c'est que le map etant fait sous substance il tile parfaitement et il est vraiment facile de varier taille, regularité, densité etc..
de pres
Le pole
Le map
Dernière modification par Floc ; 30/03/2019 à 01h31.
Merci Floc, en effet, j'ai pas oublié la mosaïque, c'est juste que chaque jour je me dis que je la ferai demain quand j'aurai le temps...
Concernant la technique de la texture, j'ai peut être montré un mauvais exemple, les points ne seront pas répétables ni aléatoires mais positionnés à des coordonnées précises. Je peux toujours comformer les points sur la texture pour pas avoir de déformation d'uv.
C'est une solution, un peu longue mais statique, car il se peut que les points changent de couleur et de position en cours d'animation, actuellement je génère mon nuage de points et couleurs à chaque image, avec une texture ce sera un peu plus lent j'en ai peur (jamais content celui-là )
Je savais pas que cette attitude portait un nom aussi savant, ça me rassure presque.