text:
Attaching a garment to a rigged figure
Can't connect the garment to the character's body. I tried DataTransfer according to a video tutorial I saw:
work.https://www.youtube.com/watch?v=SY17YJHMMMQ.
and this also:
https://www.youtube.com/watch?v=IkfgHp_eDdE
Below you can see a screenshot of my work (I downloaded the man). With the DataTransfer data on the side
In the second screenshot I tried to make a Parent between the shirt and the armature. At first it didn't do that to me, just now, but still it does it when I try to do weight paint, like in the second video

have you parented the garment to the armature (with the Armature Deform option)?

A screenshot and one or two sentences about what actually does not work would help to answer this question. Does the garment not move at all or is it badly deformed? Did you check the weights in the vertex groups to make sure they were transferred correctly? A link to the tutorial would also help readers who are interested in your question.

Hi Yair, welcome to Blender SE. I am sorry, but you didn't give us any really useful informations as you can see in the comments who are just guessing what you did or didn't because you didn't provide that necessary information. So please invest a bit more time in your question, edit it and add detail informations about what you did, add the tutorial link and maybe add your blend file so we can check out it ourselves. Thanks.

I added details, links and screenshots to the question

Can anyone help me with this? I added details.

Thanks for adding the details. The data transfer of the weights requires that the meshes are at the same spot. In your case, it looks like the character and the cloth have different rest positions. In consequence, the cloth doesn't cover the character very well and the transfer will not work for the sleeves. I would create a dummy rig for the cloth (maybe use Rigify's metarig) and align the bones to the cloth. Then bind it with automatic weights. This way you can adjust it easily. If it matches the character's pose then apply the Armature modifier and clear the parent (Alt+P).

After this, you should be able to transfer the weights and parent the cloth to the character's armature (with empty groups).

Thank you very much, I will try it.


text:
Eevee shader is still compiling unconnected nodes?
So I made a complicated stylized material node tree in eevee. It does everything I need, but it consists of a huge number of nodes, so it takes quite a long time for blender to re-compile the shader whenever a change is made and it slows my viewport down when in rendered view (which I need to work in to see lighting in shots).
I figured to make it faster while I work, I will just plug in a second simpler node tree that just gives me the basic lighting info I need to work and test things, and then when I'm ready to do the final render I'll plug the complicated one back in.
So I did that, and to my surprise, the much simpler node tree still takes a long time to compile even with all the complex nodes now totally unconnected from the material output. To get the speed I expected I actually had to either mute or delete the complex node tree from the editor, even though it was not connected to anything. This would indicate to me that Eevee's shader compiling process is still having to use resources compiling nodes even when they aren't feeding into the render, which is obviously inefficient and unnecessary.
Is my assessment correct? Is that how Eevee works? If so....why?

sorry, but how shall we know if you don't show us your nodetree?

I'm pretty sure Blender doesn't compile nodes that aren't necessary for the active "Material Output" node.
Here is how it works:

Blender checks which node is connected to the active "Material Output" node.
Blender "runs" the node and check if there are nodes connected to this node
Blender "runs" these nodes, and if there are other nodes connected to them, it "runs" them too, and so on.

Therefore, Blender does not compile nodes that are not connected to the main node tree.
But, there are some very heavy nodes even if they are single on the node trees, and there are links between nodes that slow down rendering of the viewport as well.
For further help, it would be great if you could provide your full node tree, both simple and complex.
Edit: Maybe your simple node isn't heavy at all, and you just assume it's slow, but it's actually around the average Eevee shader rendering speed on your machine, try experimenting with some very simple Eevee shaders and see if it's about as slow. If so, maybe your machine is too slow for real-time lighting.

source: Stack Exchange

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

sort: votes


text:
How to make multiple speed changes in a video
I'm using the video sequence editor to try to edit a ~2 hour video into something much shorter. I want to have a high speed multiplier during uneventful parts of the video, slow down to real time during interesting parts, and then go back to a high multiplier again. Eventually I'm going to want to add text, but one step at a time. I'm having a really hard time understanding how Blender works for speed changes.
The start of my video I'm keeping real time, and then I split the strip at the point I want to change playback speed. In the new part, I add a speed control effect, and set the multiple to the value I like:

Then, I use the sequence editor to find the next place I want to change the playback speed, I split the strip again, and then delete the speed control on the new part of the video:

However, this 3rd strip goes back in time to where the video would have been if it was playing real-time throughout. It doesn't take into account that part of the video was being played at a speed multiple.
Even when I look at the video strip that has the attached speed control effect, I can't figure out what the frame number at the end of the strip is. The numbers are all correct only if there was no speed control effect:

Here we see the sped up video started at frame 500 (start offset 499 + start frame 1), and the duration is 3550 frames. However, it's at 8x speed, so while it's 2:15 of viewer/rendered time, it's much later in original source time.
Even if I do the math myself, and calculate the exact frame number, I haven't yet been able to figure out how to get the 3rd video strip, the one that goes back to real-time after the speed up ends, to start at my calculated frame number. I think I understand "start/stop" in the sequence editor, but I don't understand "strip offset start/end" and "hold offset start/end", or what values I should enter to have my video appear uncut, just the playback speed adjusted.
How can I edit my video so that I can change the playback speed multiple times, without having any 'cuts' in the original video?
EDIT: Extra information
I'm brand new to Blender, and video editing, and I didn't know there was a difference between "hard cut" and "soft cut". Only the soft cut is available when I right click the clip in the sequence editor, but I see hold cut in the menu. Anyway, trying Chris' suggestion from his answer, I still have the same problem, but now the part of the video that is sped up doesn't work as I intended either.

See how before the split the video was at 5:33, but after the cut it was just at 0:52. Going back to the clip that has the speed control, now only the first 1/8th of the clip actually animates, the last 7/8ths holds the last frame for the full duration.

AFAIK you cannot have different speeds without cutting the strips (if you start with one strip)

how can I do it with cutting the strips? What I meant in my question was that I don't want "gaps" in the end video. If I transition from 16x speed at say 1:23:45 in the source video, I want the first frame of the 1x speed following it to start at 1:23:46 in the source video. I want it to look like someone was playing with the speed control, but for it to otherwise be the original 2 hour video without any parts of the video removed/skipped.

For only editing video, I think there are more specialized packages than Blender..  Shotcut is open source software I use for video.
https://shotcut.org/

Here is how can do it:
first place the cursor at that frame where you want to change the speed.

Press Shift+K

now press Shift+A -> Add -> Effect Strip -> Speed Control

now you can drag the right slider where you want to

if you have gaps somewhere, place the cursor on frame 1

and press Backspace
result:

if you have more gaps, press backspace again and again.

As I stated in my question, I know how to add a speed control to a strip. I even have screenshots where I've done that.  What I want to know is how to have a 3rd, 4th, 5th change in speed and have the clip start at the correct location (starting exactly where the previous clip finished)

@zivkan If you close the gaps between the strips, the following strip always starts where the previous strip finishes...? Strangely remove gaps with backspace doesn't work in my testfile, but you can always move the following strip towards the previous and manually place it on the next frame to it or hold Ctrl to snap it to the previous strip. Then place the cursor somewhere else, add more splits with Shift+K, select another strip you want to speed up, add Speed Control, size the strip down, close the gap... and so on.

@zivkan Okay, reading your question again I have to ask two things: 1. How do you split the video, with K or like Chris said in his answer, Shift+K? 2. How do you close the gap between the strips, do you move it with G (or use Backspace like Chris), or do you drag the left side of the next strip to the previous one?

I used K, not shift-K (this is my first time using Blender, or attempting to do any video editing in any app. Don't asuume I have any minimum knowledge :)  ).  I didn't have any gaps in my video. Pressing K would split the strip at the current time and there wasn't any gap.  I'm trying to create a screen gif to demo, but I have to step out now, possibly for a few hours.

You will have gaps if you use the default Speed Control. The default setting is "Stretch to Input Strip Length". Using Shift+K, it's a hard cut instead of the soft cut with K. This means, expanding the strip will not "bring back" what was there before the hard cut. If you now shorten the clip with the Speed Control from let's say 500 frames to 100 frames, it will automatically play 5x faster. Now there is a gap to the right. If you now move the following clip (the complete clip, not the left border) to the left, the gap is closed. Read the answer thoroughly before complaining you did that ;)

For what it's worth, as a newbie it's not at all obvious to me that K and shift+K are different, especially when only one of them is available in the right click context menu.  Anyway, I have the same problem, with an additional problem, when trying Chris' suggestion. Maybe it's because I'm using multiple rather than stretch for the speed control?  I updated my question with extra information and a screen recording demonstrating what I see.

EDIT 11th Dec 2021 - Improvements rewrite...
There are a few rules to follow here -
Importing variable bitrate mp4's can make maintaining sound sync somewhat more challenging , so a conversion to lossless .AVI and using that in the VSE can be a good idea.
It would probably help to set all imported strips to  --> "Replace" <---   in the properties at top right. (press N)
---> NEVER EVER <---  move a video strip without it's accompanying sound.  Once separated it can be        -  goodbye synch.
Don't forget to switch on the AV synch in the VSE's window header.
-===============-
Procedure -
Import the movie strip into the lowest strip channel.  It may help to set it to "Replace" in it's properties at right. (at the top)
At the frame where Fast Forward (FF) is to commence, do a SH-K to cut BOTH strips. (sound and video)
Move forward to the point where speed is to return to normal.  Do another SH-K there. (both strips)
Select both Sound and Video (separated at right) and drag them both to a higher channel and well to the right and out of the way, with G. (no mouse button required
Go back to the section that's to be sped-up and delete it's sound strip.
Select the (video) strip that's to be sped up and add an Effects Strip -->  'Speed Control'  to that.
Press N to see it's properties at right and type in the speed required.  (for lengthy FF,  a setting of 8.0 is a good one to try)
Untick the "Stretch to Input Length"  box and check the "Use as Speed"  box is ticked.
Set the "Speed Factor" to 1.0 .

When played it will Fast-Fwd and eventually resume normal speed again or freeze.
(You can check the cut away section (moved out of the way previously) to see what's there at it's start.  It will probably be at the same point as the FF strip's return to normal speed)
Move the timeline cursor to where the sped-up video strip resumes normal speed or freezes.
Select that video strip and drag it's right-hand end-handle, (small triangle) and drag that back to where the timeline cursor is.
Play it again to check it's doing what it's supposed to.
If desired, a  'Whiz-by' sound effect can be added to accompany the Fast Forward strip.  Do a SH-K (hard cut) on that to match the speed control's strip-length.
Move the separated trailing section to the right and well out of the way.
Select all 3 sped-up strips - Video, Speed Control, & sound effect and press CTL-G to condense them into a single Meta-strip.  (play it again to check?)  (Use ALT-G to restore)
Select the previously moved original video & audio 'strips and drag them back to join up with the end of the sped-up meta strip.
That completes the process.  Repeat the above for further Fast-Forwarding...
-=================-
IMPORTANT -
The VSE has a habit of acting up when changes are made, so before rendering and possibly earlier, save the project, exit, and reload a few seconds later. (give the computer's delayed disc-updating, time to catch up)
Play the entire sequence through before rendering.  (a precautionary step which may not be necessary)
-=================-
Speeding up the sound for Whiz-by SE -
Fire up a new instance of Blender.
In the VSE...
Import an audio or video file.  Go to the 3D viewport and in the rendering panel's 'Dimensions'  tab, set the output frame rate to 1 fps, dimensions to 600 x 400 (?)
Change the frame range to 25. (?)
In the render panel, set the output's audio to mp3 (?)
...
Back in the VSE, select the audio strip and set it's volume to 3. (?)
Set the pitch to 4 or higher.
Switch on 'AV-Sync'. (?)
Render it out.
(the sound can be separated from video in various external Video and Sound Editors)

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/


text:
How to randomly pick instanced instances in Geometry Nodes
I'm making a procedural building with geometry nodes where the walls are instanced on a generated profile from a grid and those instanced walls are being instanced vertically along a mesh line. While the 1st instance on points node is able to randomly pick mesh from a collection that contains more than 1 wall mesh, I can't find a way to randomize the walls being picked in the 2nd instance on points node which dictates the height of the building. I would also like to avoid using the realize instances node. Any help would be appreciated.

Basically, you would only have to pass a random value when instantiating the objects in the individual floors, so that the objects from your collection are selected in different order.
What I do in this example:

First I create a floor from single points of a subdivided quadrilateral curve.

I multiply this floor with Instance on Points along a mesh line in the height and realize the points with Realize Instances (The Realize Instances node is used here only to achieve the points for instantiation, but not to transform the individual objects to be instantiated).

Then I create a selection/mask with which I can separate the lowest floor from the upper floors.

When instantiating the upper floors with the node Instance on Points, I select the objects from the collection using a random value.

Here is the blend file:

I've tested it and it works quite well.


text:
Objects not visible in EEVEE renderings
My objects are not showing up in EEVEE renderings. They also aren't showing up in Viewport Shading: Rendered. You can see their outline and they show a checkerboard pattern as if they are transparent but also block whatever is behind them. Rendering works fine using CYCLES and Workbench so it seems it's an issue particular to EEVEE. Moreover, I don't know what I've done but it seems to affect all my files including ones that used to work fine that I have rendered successfully and new ones I just made with a few test objects. In Viewport Shading: Materials the objects are outlined in white or coloured dots. Is that a clue?
I've Googled the problem but can't find anything obviously useful, e.g.

yes, I've tried to unhide everything using Alt+H
yes, the camera is definitely pointing at the objects because I can see them in Viewport Shading: Solid and render them in Workbench.
yes, I have tried changing the lights.

Have I stupidly hit some shortcut key which might affect the global preferences somehow?
Could it be an issue with the recent Windows update or available memory?
Many thanks
Blender Render using Workbench:

Blender Render using cycles:

Blender Render using EEVEE:

could you please share your file? https://pasteall.org/blend/

Thanks! I uploaded the new very simple file I made which shows the same basic problem. It might be something very silly that I've forgotten.

please once you've uploaded, share the URL it will generate

https://pasteall.org/blend/266bfddf5f7245879dd4d56944028f31

With slight changes:
https://pasteall.org/blend/8a8c7115d7ca427ba9cbbe4e03792565

it works fine here, do you have a AMD? there are some problems with the latest driver...

It doesn't surprise me that it works for you. I suspect it's an issues specific to my machine or preferences. I don't know what an AMD is but a driver issue would make sense. Perhaps the latest Window update has blocked somehow.  Thanks for your efforts. I will look into AMD further.

AMD is a graphic card, I'm not 100% sure but it may be a problem with your graphic card

maybe try to enable High Quality Normals in Render panel > Performance

I have tried enabling "High Quality Normals" and updating my display adaptor drivers. Neither of these actions fixed the problem. I also checked the update history of my drivers and neither of them have updated within the last two weeks. Therefore, rolling back to previous version will not work. My problem remains unsolved.

ok weird, I hope someone will explain  :/

Many thanks for trying. I'm going to revisit the problem in a couple of weeks in the hope that further updates sort it out. Thankfully, I don't need Blender EEVEE this week but two weeks ago would've been a disaster.


text:
Solidify doesn't fill entire Mesh
I've pored over forums, youtube videos, anything to help me learn this feature. So please don't immediately smite me if you feel this is a duplicate question. Every video I've tried to learn from only solidifies the faces (ex: https://www.youtube.com/watch?v=UcBtvpwmcuQ) as opposed to an even fill throughout the mesh.
Basically, I am modeling for 3D printing. The objects I am trying to print are small enough to where they should and need to be solid. I was working on a token/disc and couldn't accomplish that so I went back to the drawing board with a basic cube to make a dice. When I apply the solidify modifier to the cube, I put it right on the threshold to where the next increment will break the visible/outer surface. I assume this means it is completely solid. However when I slice it in chitubox the layers are showing that the object is not completely solid. I feel that I've tried all settings, complex and simple versions of the solidify modifier. I am still getting incorrect results. Picture of a layer in chitubox and picture of another cube with the same modifier applied (scaling might be slightly different, I haven't yet figured out a way to view parameters of applied modifiers again once they've been applied). Again, if you feel this is a duplicate, pointing me to a forum that is attempting to accomplish the same thing is extremely appreciated. I have yet to find a correct source to learn a way to apply this feature in a way that accomplishes my goal. Thank you to any helpful replies in advance.
Edit: I've worked out that at least in this case it has something to do with the beveled edges. A regular cube mesh solidifies fine. Am I missing a boolean modifier somewhere? The token/disc I assume is having the same issue due to the geometry of the faces. I would attach a picture of that however I'm so deep into that project that I've forgotten what I've applied, in what order, etc.

I dont think a solidify modifier is needed in this case. If the mesh has no holes it should be solid. Have you tried directly exporting your dice without adding a solidify modifier?

A humbling experience to say the least... I knew it was simple but dang. So as a follow-up... why does solidify exist? To create a hollowed model where you just add thickness to the geometry of the faces? I'm fairly certain I tried this on the disc file I was working on and also had this problem, however I'm retracing my steps to confirm

solidify is often used for objects with no thickness at all(for example if you add a plane). I think you would have a better understanding of solidify if you 1. added a cube 2. added a solidify modifier 3. deleted the top face of the cube. This way you could see what the solidify modifier does

I had been doing that to test the solidify modifier in the first place, which initially led me to believe that the meshes are hollow. I understand it's 3D modeling which should inherently mean the objects should be solid but that wasn't what my testing was showing. However, when an SVG is imported and converted to mesh, I'm not finding that it is inherently solid. Do you agree or disagree with that?

an imported svg has no thickness.  I agree with that. Adding a solidify modifier in this case would give it thickness and therefore you would be able to print it then.

I think your question stems from not understanding 3D-modelling in general. In your case you don't apply solidify modifier to a set of faces to physically fill it. That does not make any sense since your geometry is described mathematically by a set of faces.
As a simple example: You want to model a cube with just 6 faces. Manually you could just create 8 vertices for 6 properly aligned faces. With face-normal direction you have your cube. There is nothing inside the cube. No need to fill/solidify anything. A closed 6 face-cube-object is solid per definition.

I haven't yet figured out a way to view parameters of applied modifiers again once >they've been applied

I don't see why you need to apply them in your case.

When I exported other "solid" objects to STL for printing, they sliced as hollow. Your down talking and inability to address the actual question is just as dumb as you perceive this question to be. Whether or not I need to apply modifiers in this specific example doesn't mean that it still couldn't be met with useful help.

Considering what you wrote: You don't understand 3D-modelling in general and don't have understanding of the math that is underlying blender. That was not meant as downtalking but just stating that you are misunderstanding something. I even adressed your question when I wrote two times that you don't need to solidify.
Even what you commented to the other guy shows that you misunderstand "3D". Actually just tried to give advice (+ Im not native English speaker).

It's almost as if this is a forum designed to learn. I've been working on this problem for 3 days and exhausted all other resources knowing I would receive feedback like this regardless. Currently working through a 7 day course of learning blender to understand functionality of the software, but trying to work on other projects in the meantime. However, learning the basic functionality of blender still doesn't add up to suddenly understanding 3D modeling. Again-have read extensively on the solidify modifier & all forums said it would add depth which I clearly wasn't getting in initial testing.

Additionally - I have an SVG extruded and converted to a solid mesh. A 3D, closed, mesh, that is slicing with no volume. The solidify modifier, as I understand it, would be needed here but is not accomplishing what I am aiming for.

I'm sorry but it really seems you don't understand solid objects. I create objects for friends to print them and I never needed to "fill" them in any way. If the mesh is closed, i.e. no open sides, everything connected properly (I mean, where there is an edge between two faces, this edge should be a single one belonging to both faces, not two edges lying on top of each other so that it only appears to be closed, same goes for vertices) and the face normals are pointing outwards so that outside and inside are correctly defined, this mesh is solid in 3D.

Not enough space in the comments, sorry for adding a second one. So I export this closed mesh as STL and give it a friend. In his slicer program he then sets parameters how the inside of the object is filled, for example fully if he wants to make it heavy and waste a lot of material or filled with some structure, deciding on how high the percentage of filled volume should be, so it will be filled with a more or less dense structure.

Oh, and about this forum: it's not exactly a forum, it's more a Q&A site, not exactly designed to learn (of course you can learn things here, but there are no tutorials for example), it's more like when you have a specific problem you want to solve, you can ask if someone has a solution for that. Insulting people who try to explain to you where you might be wrong in comprehending the software or 3D objects in order to help you will not increase your chances of getting a solution.


text:
Boolean union fails to delete internal geometry
I fairly frequently run into problems with boolean unions not deleting the internal geometry. I often resort to going through and cleaning it up by hand, but I feel like there should be a better way, and this one would be a bit taxing to do manually.
Both structures are solid, fully manifold objects, they don't share any faces, and I have recalculated the normals on both of them.
I took a picture with it lifted up out of the object because its too much of a mess in wireframe mode, but when I do the boolean modifier you can clearly see the point of the support still exists inside the object below, and I would have to go through and clean them up all the way around the circle.
Any tips would be appreciated.

Union is doing the work it is assigned to! What you want do exactly!

You probably need to use Difference in place of union!

Union is not supposed to leave behind internal geometry, It is supposed to merge the two into one solid object, deleting any parts that are inside each other.
Difference would not join my two parts together, it would carve a hole in the bottom part for each one of the top parts, and leave them separate.

Do you have ref image of what you want to do?

In the image I provided, the pieces to the left and right of the raised piece are in the position I want. That is what I want them to look like on the outside. But when I join them blender leaves behind the small point of each support inside the main piece, and It generates 2 faces separating the 2 parts from each other, so when I go to 3d print it the printer will be confused and not know how to handle those internal pieces. I will try to take some pictures.

I have added a picture taken from the inside. In the back you can see a point as blender is leaving it, in the middle of the picture is one where I have deleted most of the undesired geometry by hand. There is still one face in the corner that shouldnt be there, and there is a faces still separating the two object from each other. I need both gone, so it is just one external envelope around both objects.

In which object do you add boolean modifier, the main or the other one?

I think boolean bugs sometimes, but maybe share your file?


text:
Assigning Array and Curve for a large number of curves
I have a very large number of curves (OpenStreetMap data imported as curves) on which I wish to array objects (streetlights).
Since there are thousands of curve objects, duplicating my streetlight object and then manually adding an array and curve modifier and point them to the right curve is a slow if not impossible process when there is this many curve objects.
The best solution I can think of is a script, however I am not familiar with the process. I've only gone as far as making the script add an array modifier.
The imported curves are all numbered as Road0, Road1, Road2, Road3, etc
Here is my script so far
import bpy

bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":False, "mode":'TRANSLATION'}, TRANSFORM_OT_translate={"value":(-0, 0, 0), "orient_type":'GLOBAL', "orient_matrix":((1, 0, 0), (0, 1, 0), (0, 0, 1)), "orient_matrix_type":'GLOBAL', "constraint_axis":(False, False, False), "mirror":True, "use_proportional_edit":False, "proportional_edit_falloff":'SMOOTH', "proportional_size":1, "use_proportional_connected":False, "use_proportional_projected":False, "snap":False, "snap_target":'CLOSEST', "snap_point":(0, 0, 0), "snap_align":False, "snap_normal":(0, 0, 0), "gpencil_strokes":False, "cursor_transform":False, "texture_space":False, "remove_on_cancel":False, "release_confirm":False, "use_accurate":False})
bpy.ops.object.modifier_add(type='ARRAY')
bpy.context.object.modifiers["Array"].fit_type = 'FIT_CURVE'
bpy.context.object.modifiers["Array"].relative_offset_displace[0] = 50
bpy.context.object.modifiers["Array"].curve = bpy.data.objects["RoadTertartiary0"]

I basically need a way to make that last 0 increment every time I run the script
Sample Blend file:

Any help is appreciated.

Could you add some information about the curves and the object to be dupli? Eventually, a simple blend file with sample of them that you could upload here using https://blend-exchange.giantcowfilms.com/

There's nothing special I'd say about the objects and curves, I have included the blend file now.

This script can do the job I think:
Basically, it will loop over the collection where the roads are,
then copy the base lamp, put it at the current road location and create the two needed modifiers (array and curve).
the copies are placed in a separate collection.
The script is commented below:
import bpy
import bmesh

# get an existing collection or create it if it does not exist
# if created, the collection is added to the scene main collection
def get_or_create_collection( scene, collection_name ):
    collection = bpy.data.collections.get( collection_name )
    if collection is None:
        collection = bpy.data.collections.new( collection_name )
        scene.collection.children.link( collection )
    return collection

# duplicate an object and link it to a collection
# copy_data allow to know if the objects will share their data or not (are dupli or not)
def duplicate( obj, collection, copy_data ):
    new_obj = obj.copy()
    if copy_data:
        new_obj.data = obj.data.copy()
    collection.objects.link( new_obj )
    return new_obj

# get the scene
scene = bpy.context.scene

# get the base lamp
base_lamp = bpy.data.objects["Lamp_LowPoly"]

# names of the collections
road_collection_name = "map_6.osm_roads_tertiary"
lamps_collection_name = "created_lamps"

# get the source collection
road_collection = bpy.data.collections.get( road_collection_name )

if road_collection is None or base_lamp is None:
    print( "will not work" )
else:
    # get the destination collection
    lamps_collection = get_or_create_collection( scene, lamps_collection_name )

    for road in [r for r in road_collection.objects if r.type == 'CURVE']:
        # Duplicate the base lamp (True => not linked)
        lamp = duplicate( base_lamp, lamps_collection, True )
        # Set the lamp at the road location so that curve can work
        lamp.location = road.location
        # Add the array modifier
        array_modifier = lamp.modifiers.new( "array", 'ARRAY' )
        array_modifier.fit_type = 'FIT_CURVE'
        array_modifier.relative_offset_displace[0] = 50
        array_modifier.curve = road
        # Add the curve modifier
        curve_modifier = lamp.modifiers.new( "curve", 'CURVE' )
        curve_modifier.object = road

    print( 'done' )

That is impressive.
Thank you so much. I will study this and adapt it if I ever have to do this again. Again, thank you.

FYI I've set duplicate( base_lamp, lamps_collection, True ) with 'True' above because you did "linked":False in your script. But I think it is not necessary in your case.

That is fine, I'm merging them into one object in the end anyway :)

Thank you lemon, your script is very useful, it is just what I need from a year ago.
I edited the script (names for a more generic work and not linked to the lamp), Mainpath for curves and Mainclone name for object. I changed the type of displacement to Constant Offset.
import bpy
import bmesh

# Scripting: lemon
# https://blender.stackexchange.com/users/19156/lemon
# Aug 15 '19 at 12:37
# get an existing collection or create it if it does not exist
# if created, the collection is added to the scene main collection
def get_or_create_collection( scene, collection_name ):
    collection = bpy.data.collections.get( collection_name )
    if collection is None:
        collection = bpy.data.collections.new( collection_name )
        scene.collection.children.link( collection )
    return collection

# duplicate an object and link it to a collection
# copy_data allow to know if the objects will share their data or not (are dupli or not)
def duplicate( obj, collection, copy_data ):
    new_obj = obj.copy()
    if copy_data:
        new_obj.data = obj.data.copy()
    collection.objects.link( new_obj )
    return new_obj

# get the scene
scene = bpy.context.scene

# get the base main clone
base_Mainclone = bpy.data.objects["Mainclone"]

# names of the collections
mainpath_collection_name = "Mainpath"
clones_collection_name = "Created_clones"

# get the source collection
mainpath_collection = bpy.data.collections.get( mainpath_collection_name )

if mainpath_collection is None or base_Mainclone is None:
    print( "will not work" )
else:
    # get the destination collection
    clones_collection = get_or_create_collection( scene, clones_collection_name )

for mainpath in [r for r in mainpath_collection.objects if r.type == 'CURVE']:
    # Duplicate the base main clone (True => not linked)
    Mainclone = duplicate( base_Mainclone, clones_collection, True )
    # Set the lamp at the road location so that curve can work
    Mainclone.location = mainpath.location
    # Add the array modifier
    array_modifier = Mainclone.modifiers.new( "array", 'ARRAY' )
    array_modifier.fit_type = 'FIT_CURVE'
    array_modifier.use_relative_offset = False
    array_modifier.use_constant_offset = True
    array_modifier.constant_offset_displace[0] = 10
    array_modifier.curve = mainpath
    # Add the curve modifier
    curve_modifier = Mainclone.modifiers.new( "curve", 'CURVE' )
    curve_modifier.object = mainpath

print( 'done' )


text:
Anyway to have stripes of different textures without making a lot of geometry?

I have 2 materials that have the same texture, but different hue node values. I want to have stripes that are only in specific areas of the mesh and I want to have the orange stripe repeat after every 4 blue tiles. This is the best way I could think off and it's most likely very bad way of doing this. Is there a proper way of doing such a thing?

The best thing I can think is to make a model with the necessary geometry to facilitate the stripes, then bake a texture map of the setup and apply it to the same model, minus the geometry. An alternative is to have a mix shader combining the two materials, with the mix factor controlled by the position value of a texture co-ordinate. You would probably have to make some nightmarish setup of math and mapping nodes to get the positioning just right though.

Ya was thinking maybe doing the first one. If I'm making floor for a building and baked the texture, would it be a gigantic texture?

Not necessarily. Baking yields a "texture atlas" at whatever resolution you set while making it. Usually you want to pick a higher resolution (2048x2048 common) so the final result doesn't come out blurry. Don't fret over the larger texture size though (especially with regards to performance), as baking serves to replace multiple materials, as well as reducing draw calls on the object. You can even go 4K if necessary... but it's probably still best stick to what you can get away with.


text:
Part of sculpture is low poly
As you can see the head of the sculpture is high poly. But the lower part is low poly. I tried smoothing it out but it stays like this.
Does anyone know what I can do about it?

This, if it was an imported model, could have been sculpted with dyntopia sculpting. It may have also been modeled in edit mode, instead of sculpting. In this case, the best way to achieve a nice-looking result would be to subdivide, or to save memory, subdivide those faces.

It wasn't imported. I created it in sculpt mode.

Then subdivide.


text:
Unable to remove unwanted edges after fill
So i have a shape:

That i fill:

and after doing a "Limited dissolve" it looks a little better:

But it leaves some edges that are impossible to delete without either deleting the face or messing up the shape, this is what happens if i delete the white edge:

Anyone knows how to fix this?
I have googled and watched a ton of YT tutorials but not been able to figure this out.
Thanks for reading my question and have a nice one!

Related: https://blender.stackexchange.com/questions/48954/merge-around-a-face?noredirect=1&lq=1

You are messing with N-gons too much. Here is an advanced solution for this problem in Box Cutter add-on: https://www.youtube.com/watch?v=BJ7P2n1cAFY

This is OK as dissolve, limited or not, removes edges that are not crucial to the mesh and never leaves a one big ngon. And the edges are not visible in the final render.

There is no way to clean all edges in your object. Since blender cant handle holes inside n-gon by one face. You can make nicer topology by manual reconecting some of the edges (or try to search for Beautiful Fill function), but you will need always at least two faces (two edges connected to a hole).

In some cases would be better simply select object and Convert to Curve type 2D. No more additional edges, just outlines.

Ok, i think i understand the issue now.
But even if i try to clean it up, when i extrude it and curve it around a circle it looks horrible:
.
Do you have any hints on how i can accomplish the same thing, an extruded pattern on a cylinder?

https://blender.stackexchange.com/questions/160720/curve-object-deformed-by-curve-distortions-artefacts/160721#160721

A trick to simplify the faces is to select two of the split faces, and press 'F' in edit mode. This will join the faces together, and simplify the face. FYI, this does not work with non-touching faces.

Yes, i tried in on my shape but it filled the empty spaces also, so it did not work for me.


text:
How to create realistic steam in blender?
Situation
I created a fluid simulation of boiling water in a pot. Now I am trying to create photo realistic steam in blender. I want to show the steam rising up from the pot. Here you can see what I had in mind (only a picture; I want an actual animation of course):

Problem
I was trying to realize this using a smoke simulation. But due to the reason that I am new to this I ran into some problems. I was not able to change the color of the smoke to a seethrough white. I also tried to make the smoke look less dense, but I couldn't find any ways to do so.
Question
Can someone tell me which settings I need to look into and what values to change them to? I attached my .blend file so you can check out what I got so far
.blend File

In addition to what cegaton said, also make sure the color of the smoke is completely white.  The way I like to do this is switch the color picker to HSV mode and type in 1 for the V slider.

this might help some PS i hope you have success https://www.youtube.com/watch?v=I2m9Re8N78I
also try this node set up


text:
Unable to use sculpt function
I downloaded a 3D model by warfaremachine, and I am unable to use any of the sculpt functions. I have the desired shape key selected and set to 1000.
When the textures are disabled, the model is a darker gray than it should be, and sculpt tools don't even seem to work on the selected model. Is this a setting I don't know of, or a glitch?

i solved it. for some reason, warfare machine decided to invert the mask of this model.


text:
Why is one face in my mesh not being rounded by the subsurf modifier?
Why is one rectangle being the same fixed point and not being rounded?

Subdivision 6 is really too much. Stay under 4 if possible (3 should be enough)

Remove doubles if you already didn't.

The problem could be that you have duplicated vertices.
Try to select the overlapping vertices in your red circle (the one you draw in the screenshot) and merge them Alt+M in Edit Mode. Do it for all the 4 areas that generate the rectangle.


text:
Blender Can't Find GPU
I have 2 NVIDIA GTX 1080 Tis with updated drivers and CUDA installed.
I’m currently trying to render my scene in Blender 2.81 (though this happens on other versions of Blender as well) on Ubuntu 18.04.
When I go to Preferences, then System, and finally Cycles Render Devices, the 2 GPUs are listed under the CUDA tab.
However, after rendering a couple of times, it seems that the GPUs stop working all of a sudden, as if I go to check Cycles Render Devices afterwards, it now says
No compatible GPUs found for path tracing. Cycles will render on the CPU
If I list the devices in Blender’s Python Console using:
bpy.context.preferences.addons["cycles"].preferences.devices

it seems that the 2 GPUs are visible to Blender:

CyclesDeviceSettings(“GeForce GTX 1080 Ti”)
CyclesDeviceSettings(“GeForce GTX 1080 Ti”)

I also notice when I try to start Blender up, I get this error:

CUDA cuInit: Unknown error

It seems that the only way to solve this error is to restart my computer, after which the GPU rendering option is available, until this issue repeats itself.
Any ideas on why this might happen?


text:
How to add uv to a mesh with 4 or 8 vertices in blender API using smart_project function
I am trying to write an script which adds UV maps to different meshes in a scene using smart_project() function, and while the code works for some of the mesh objects, it fails for some others. The meshes for which this process fails seem to have either 4 or 8 vertices. I really appreciate it if someone could explain what is going wrong or how to fix this issue.
Here is the code:
bpy.ops.import_scene.obj(filepath=orig_obj_path, use_edges=True,use_smooth_groups=True,                                 use_split_objects=True, use_split_groups=True,use_groups_as_vgroups=False,use_image_search=True)
context = bpy.context
scene = context.scene
vl = context.view_layer
bpy.ops.object.select_all(action='DESELECT')
for obj in scene.objects:
    # try:

    if (obj.type == 'MESH'):

        if obj.name == 'Cube':
            bpy.data.objects[obj.name].select_set(True)
            bpy.ops.object.delete()
            continue
        print("the number of vertices: ", len(obj.data.vertices), "name: ", obj.name)
        # if len(obj.data.vertices) < 9:
        #     bpy.data.objects[obj.name].select_set(True)
        #     bpy.ops.object.delete()
        #     continue
        vl.objects.active = obj
        obj.select_set(True)
        print(obj.name)
        lm =  obj.data.uv_layers.get("LightMap")
        if not lm:
            lm = obj.data.uv_layers.new(name="LightMap")
        lm.active = True
        bpy.ops.object.editmode_toggle()
        bpy.ops.mesh.select_all(action='SELECT') # for all faces
        bpy.ops.uv.smart_project(angle_limit=66, island_margin = 0.02)
        bpy.ops.object.editmode_toggle()
        obj.select_set(False)

bpy.ops.export_scene.obj(filepath=out_path,
                                 group_by_material=True,
                                 keep_vertex_order=True,
                                 use_normals=True, use_uvs=True,
                                 use_materials=True)

The following is the error message I am receiving:

the number of vertices:  59 name:  mesh1_mesh1-geometry
mesh1_mesh1-geometry
the number of vertices:  4 name:  mesh2_mesh2-geometry
mesh2_mesh2-geometry
Traceback (most recent call last):
File "test_blender.py", line 94, in
bpy.ops.uv.smart_project(angle_limit=66, island_margin = 0.02)
File "/lib/python3.9/site-packages/3.1/scripts/modules/bpy/ops.py", line 132, in call
ret = _op_call(self.idname_py(), None, kw)
RuntimeError: Operator bpy.ops.uv.smart_project.poll() failed, context is incorrect

Please clarify your specific problem or provide additional details to highlight exactly what you need. As it's currently written, it's hard to tell exactly what you're asking.

It would help if you could cut and paste your code and any error message into your question.

I updated my question with the code and the error message.

the angle limit should be in radians, check the manual, also test smart_project operator without any parameters... other than that script seems to work for me, at least with blender meshes, didn't try the obj import thing

or you mean objects with no faces, just vertices... in that case it will fail, you should check if your object has a suitable mesh, something like 'if len(object.data.polygons): '

Thanks for the response, yes it seems that there are only vertices and not polygons for the mesh crashing the script. Then would that be safe to delete such objects from the scene?


text:
How to load a PBR texture map into blender and apply it to a mesh?
I am trying to add new materials to a mesh and for this purpose, I need to load PBR materials from maps using blender API. I am using the class MDLMaterial in the following code snipet to load mdl materials:
import uuid
import bpy
import json

from pathlib import Path

import math

import warnings

import mdl
from brender.mesh import PASS_INDEX_UV_DENSITY_MULT
from toolbox.io.images import load_image, load_hdr

class BlenderMaterial(object):
    _next_id = 0

    def __init__(self, bobj=None, name=None, **kwargs):
        if name and not bobj:
            self.name = name
        elif bobj:
            self.name = bobj.name
        else:
            self.name = f'brender_material_{BlenderMaterial._next_id}_{uuid.uuid4()}'

        if bobj is None:
            self._bobj_was_given = False
            if self.name in bpy.data.materials:
                raise ValueError(f'Blender material {self.name!r} already '
                                 f'exists')
            BlenderMaterial._next_id += 1
            bpy.data.materials.new(name=self.name)
            self._bobj = bpy.data.materials[self.name]
            print(f'Created new material {self.name}')
        else:
            self._bobj_was_given = True
            self._bobj = bobj

    @property
    def bobj(self):
        return self._bobj

    def mean_roughness(self) -> float:
        raise NotImplementedError

    def __del__(self):
        pass

class NodesMaterial(BlenderMaterial):
    def __init__(self,
                 uv_ref_scale=1.0,
                 uv_translation=(0, 0),
                 uv_rotation=0,
                 **kwargs):
        super().__init__(**kwargs)
        self.bobj.use_nodes = True
        self.uv_ref_scale = uv_ref_scale
        self.uv_translation = uv_translation
        self.uv_rotation = uv_rotation

        # self.clear_nodes()
        self.uv_ref_scale_node = None

        nodes = self.bobj.node_tree.nodes
        if 'Material Output' not in nodes:
            output_node = nodes.new(type="ShaderNodeOutput")
            output_node.name = "Material Output"

        self.init_nodes()

    def clear_nodes(self):
        self.bobj.node_tree.nodes.clear()
        self.bobj.node_tree.links.clear()
        nodes = self.bobj.node_tree.nodes
        output_node = nodes.new(type="ShaderNodeOutput")
        output_node.name = "Material Output"

    @property
    def has_uvs(self):
        return self.uv_ref_scale_node is not None

    def connect_scale_node(self, map_nodes):
        nodes = self.bobj.node_tree.nodes
        links = self.bobj.node_tree.links

        uv_node = self.init_uv_node(nodes, links)

        for map_node in map_nodes:
            links.new(map_node.inputs[0], uv_node.outputs[0])

    def set_uv_ref_scale(self, uv_ref_scale):
        self.uv_ref_scale = uv_ref_scale
        self.update_uv_node()

    def update_uv_node(self):
        if self.uv_ref_scale_node is None:
            raise ValueError('UV scale node has not been initialized yet.')

        self.uv_ref_scale_node.outputs[0].default_value = self.uv_ref_scale

    def init_uv_node(self, nodes, links):
        self.uv_ref_scale_node = nodes.new(type='ShaderNodeValue')
        self.update_uv_node()

        obj_info_node = nodes.new(type='ShaderNodeObjectInfo')
        obj_info_to_uv_density_node = nodes.new(type='ShaderNodeMath')
        obj_info_to_uv_density_node.operation = 'DIVIDE'
        obj_info_to_uv_density_node.inputs[1].default_value = \
            PASS_INDEX_UV_DENSITY_MULT
        links.new(obj_info_to_uv_density_node.inputs[0], obj_info_node.outputs[1])

        # Divide our desired scale by the object UV density:
        #   uv_scale = uv_ref_scale / uv_density
        uv_scale_node = nodes.new(type='ShaderNodeMath')
        uv_scale_node.operation = 'DIVIDE'
        links.new(uv_scale_node.inputs[0], self.uv_ref_scale_node.outputs[0])
        links.new(uv_scale_node.inputs[1],
                  obj_info_to_uv_density_node.outputs[0])

        uv_map_node = nodes.new(type="ShaderNodeUVMap")
        separate_uv_node = nodes.new(type="ShaderNodeSeparateXYZ")
        combine_uv_node = nodes.new(type="ShaderNodeCombineXYZ")

        links.new(separate_uv_node.inputs[0], uv_map_node.outputs[0])

        for i in [0, 1, 2]:
            mult_node = nodes.new(type="ShaderNodeMath")
            mult_node.operation = 'MULTIPLY'
            links.new(mult_node.inputs[0], separate_uv_node.outputs[i])
            links.new(mult_node.inputs[1], uv_scale_node.outputs[0])
            links.new(combine_uv_node.inputs[i], mult_node.outputs[0])

        # Translate (or possible rotate) UVs.
        mapping_node = nodes.new(type="ShaderNodeMapping")
        mapping_node.vector_type = 'TEXTURE'
        mapping_node.inputs['Rotation'].default_value[2] = self.uv_rotation
        mapping_node.inputs['Location'].default_value[0] = self.uv_translation[0]
        mapping_node.inputs['Location'].default_value[1] = self.uv_translation[1]
        # mapping_node.translation[0] = self.uv_translation[0]
        # mapping_node.translation[1] = self.uv_translation[1]
        # mapping_node.rotation[2] = self.uv_rotation
        links.new(mapping_node.inputs[0], combine_uv_node.outputs[0])

        return mapping_node
        # return combine_uv_node

    def init_nodes(self):
        raise NotImplementedError

    @classmethod
    def load_annotations(cls, path):
        annot_path = path / 'annotations.json'
        if annot_path.exists():
            with open(annot_path, 'r') as f:
                scale = json.load(f).get('scale', 1.0)
                print(f'Loaded scale={scale} from {annot_path}')
        else:
            scale = 1.0
        return scale

class MDLMaterial(NodesMaterial):
    BASE_COLOR_INP_ID = 0
    SUBSURF_COLOR_INP_ID = 3
    METALLIC_INP_ID = 4
    SPECULAR_INP_ID = 5
    ROUGHNESS_INP_ID = 7
    IOR_INP_ID = 14
    TRANSMISSION_INP_ID = 15
    NORMAL_INP_ID = 16

    @classmethod
    def from_path(cls, mat_path, **kwargs):
        if not mat_path.exists():
            raise FileNotFoundError(mat_path)

        parsed_dict = mdl.parse_mdl(mat_path)

        for k, v in parsed_dict.items():
            if isinstance(v, str):
                kwargs[k] = Path(mat_path.parent, v)
            elif isinstance(v, float):
                kwargs[k] = v
            elif isinstance(v, tuple):
                kwargs[k] = v
            elif v is None:
                warnings.warn(f'Value for {k} is None')
            else:
                raise ValueError(f'Unknown value type: {v}')

        return cls(mdl_path=mat_path, **kwargs)

    def __init__(self,
                 *,
                 mdl_path,
                 base_color,
                 roughness,
                 opacity=1.0,
                 normal=None,
                 metallic=0.0,
                 glow=0.0,
                 translucence=0.0,
                 subsurface_color=None,
                 ior=1.450,
                 height=None,
                 height_scale=1.0,
                 **kwargs):
        self.mdl_path = mdl_path
        self.base_color = base_color
        self.opacity = opacity
        self.roughness = roughness
        self.normal = normal
        self.metallic = metallic
        self.translucence = translucence
        self.glow = glow
        self.subsurface_color = subsurface_color
        self.ior = ior
        self.height = height
        self.height_scale = height_scale

        self.tex_nodes = []
        super().__init__(**kwargs)

    @property
    def substance(self):
        return self.mdl_path.parent.parent.name

    @property
    def source_name(self):
        return self.mdl_path.stem

    def _add_input(self, value, input_id, color_space, bsdf_node,
                   invert=False):
        if not value:
            raise ValueError('Value is None')

        nodes = self.bobj.node_tree.nodes
        links = self.bobj.node_tree.links

        if isinstance(value, Path):
            tex_node = nodes.new(type="ShaderNodeTexImage")
            # tex_node.color_space = color_space
            tex_node.image = bpy.data.images.load(
                filepath=str(value))
            if color_space != 'COLOR':
                tex_node.image.colorspace_settings.is_data = True

            self.tex_nodes.append(tex_node)
            if invert:
                opacity_invert_node = nodes.new(type='ShaderNodeInvert')
                links.new(opacity_invert_node.inputs[0], tex_node.outputs[0])
                links.new(bsdf_node.inputs[input_id],
                          opacity_invert_node.outputs[0])
            else:
                links.new(bsdf_node.inputs[input_id], tex_node.outputs[0])
        elif isinstance(value, tuple):
            if invert:
                bsdf_node.inputs[input_id].default_value = \
                    tuple(1 - v for v in value)
            else:
                bsdf_node.inputs[input_id].default_value = value
        elif isinstance(value, float):
            bsdf_node.inputs[input_id].default_value = \
                (1 - value) if invert else value
        else:
            RuntimeError(f'Invalid type {value!r}')

    def init_nodes(self):
        self.tex_nodes.clear()
        nodes = self.bobj.node_tree.nodes
        links = self.bobj.node_tree.links

        bsdf_node = nodes.new(type="ShaderNodeBsdfPrincipled")
        bsdf_node.distribution = 'MULTI_GGX'

        if self.normal:
            normal_map_node = nodes.new(type="ShaderNodeNormalMap")
            normal_map_node.space = 'TANGENT'

            if isinstance(self.normal, Path):
                normal_tex_node = nodes.new(type="ShaderNodeTexImage")
                # normal_tex_node.color_space = 'NONE'
                normal_tex_node.image = bpy.data.images.load(
                    filepath=str(self.normal))
                normal_tex_node.image.colorspace_settings.is_data = True
                self.tex_nodes.append(normal_tex_node)
                links.new(normal_map_node.inputs[1], normal_tex_node.outputs[0])
            elif isinstance(self.normal, tuple):
                normal_map_node.inputs[1].default_value = self.normal

        if not self.base_color:
            raise RuntimeError('Base color must be defined.')
        else:
            self._add_input(self.base_color, self.BASE_COLOR_INP_ID, 'COLOR',
                            bsdf_node)

        if self.subsurface_color:
            self._add_input(self.subsurface_color, self.SUBSURF_COLOR_INP_ID,
                            'COLOR', bsdf_node)

        if self.roughness:
            self._add_input(self.roughness, self.ROUGHNESS_INP_ID, 'NONE',
                            bsdf_node)

        if self.metallic:
            self._add_input(self.metallic, self.METALLIC_INP_ID, 'NONE',
                            bsdf_node)

        # if self.opacity:
        #     self._add_input(self.opacity, self.SPECULAR_INP_ID, 'NONE',
        #                     bsdf_node, invert=False)

        if self.ior:
            self._add_input(self.ior, self.IOR_INP_ID, 'NONE', bsdf_node)

        output_node = nodes["Material Output"]

        if self.height:
            bump_node = nodes.new(type="ShaderNodeBump")
            bump_node.inputs[0].default_value = self.height_scale
            if self.normal:
                links.new(bump_node.inputs[3], normal_map_node.outputs[0])

            if isinstance(self.height, Path):
                height_tex_node = nodes.new(type="ShaderNodeTexImage")
                # height_tex_node.color_space = 'NONE'
                height_tex_node.image = bpy.data.images.load(
                    filepath=str(self.height))
                height_tex_node.image.colorspace_settings.is_data = True

                self.tex_nodes.append(height_tex_node)
                links.new(bump_node.inputs[0],
                          height_tex_node.outputs[0])
            elif isinstance(self.height, float):
                bump_node.inputs[0].default_value = self.height

            links.new(bsdf_node.inputs[self.NORMAL_INP_ID],
                      bump_node.outputs[0])
        elif self.normal:
            links.new(bsdf_node.inputs[self.NORMAL_INP_ID],
                      normal_map_node.outputs[0])

        self.connect_scale_node(self.tex_nodes)

        links.new(output_node.inputs[0], bsdf_node.outputs[0])

    def mean_roughness(self):
        if isinstance(self.roughness, Path):
            if (self.roughness.name.endswith('.exr')
                    or self.roughness.name.endswith('.hdr')):
                roughness_map = load_hdr(self.roughness)
            else:
                roughness_map = load_image(self.roughness)
            if len(roughness_map.shape) == 3:
                roughness_map = roughness_map[:, :, 0]

            return roughness_map.mean()
        elif isinstance(self.roughness, float):
            return self.roughness

        raise RuntimeError('Invalid roughness value')

But for some reasons, the material is not loaded properly into blender as I render my mesh. the following image is what I expect to see:

But I am getting the following rendered image, in which the texture is incorrect and the look is unrealistic:

Here is also the link to brender module which I used for the purpose of rendering:
https://github.com/keunhong/brender/tree/cfeedffba72c6ca79926231c31e36e7ff249eacd

If I understand correctly, it seems that you are trying to find out how to setup a PBR material using python? If that's the case, you should definitely edit your proposal to make that clear, as well as show exactly what you are doing so far so that people have a clear context.

Thanks for the comment, I rephrased the question, hopefully it is more clear now.


text:
Glitchy animation is driving me insane, please help
I'm new here and fairly new to blender. Amazing software.
https://i.sstatic.net/3afhi.gif
As you can see from the gif, I encountered a problem animating my scene and I spent most of the day trying to figure out what causes it and how to fix it with no luck. What bothers me the most is that everything works as expected except those two vertical moves, whereas the outcomes are correct but the animation gets glitchy.
Do you guys have any idea why? I leave the link to the blender file in case you feel brave enough to give it a try --> https://we.tl/t-AwTSGAwhvW
Thanks in advance.

I think you are experiencing something like gimbal lock due to the repeated rotation.  If you just pick one of the cubes (3faced.001) you can see it rotates from <0, 0, -180> to <180, -90, 0> on frames 72-78. Blender has to try to figure out how to interpolate between those values and chooses a mathematical route, which doesn't necessarily match the best visual.
The easiest fix is adding more keyframes - if you add keys on the frames in between it should fix the rotations.
A possibly better fix would be to rotate/keyframe using Quaternion instead of Euler XYZ.  You could also possibly try 'Apply Rotation' periodically so your rotations don't cross the 180 degree line.

Thank you for your suggestions. I have tried to switch rotation mode but quaternion and any other didn't fix the problem in my case, same goes for periodically applying rotation. Although it was helpful to learn that the issue is pretty common and known with the name "gimbal lock." By googling it I reached a tutorial explaining every possible way to work around it, to me was baking the action to an empty and then back to the object for every single broken cube. I'll leave the link in case somebody else needs it --> https://www.youtube.com/watch?v=ETRVoI3nBbM

Sorry, I was going to put images and more detailed explanations here but something came up so I had to cut it short. Glad you were able to find a solution!


text:
Use a driver to programmatically set the positions of many vertices
I would like to use the position of an object ('driver object') as a parameter that interactively sets the positions of many vertices in a mesh. These positions are some nontrivial function of the position of the driver object, and so I want to use the power of python.
Here's what I did so far: I created an empty ('driven object') who's x position is set by a driver with a variable var that is set by the x position of the driver object. But the driver expression is set to update(var), where update is a python script that was registered in the driver namespace using bpy.app.driver_namespace.
The python script goes over the vertex positions of all vertices in a mesh and changes their position:
    ob = bpy.data.objects['graph_plane']
    for i in range(len(ob.data.vertices)):
        co = ob.data.vertices[i].co
        co[2]= co[1]*var/2 #that's just an example
        ob.data.vertices[i].co=co

My problem is that while the mesh is changed when the driver object is moved, the appearance of the object in the view remains the same. It only updates after I apply ob.data.update() to the object in the console after I finish moving the driver object, or if I select the object and go into edit mode. I tried to update the view within the script by inserting bpy.context.view_layer.update(), but then I get a "Dependency graph update requested during evaluation" error.
Any ideas? Thanks.

Use frame change handler
Drivers are designed, and best used, where the field you add a driver to is the value the driver controls. It seems the way you use a driver is add it to some field where you're not actually interested in the value returned from the custom function added to the driver namespace, but rather use the side effects. Since adding a custom function to a driver namespace requires you to run a script after opening the .blend file each time, with its downsides, you can as well use a standard technique with the same downsides, that is actually intended for such purposes. So instead of:
import bpy
from math import sin, cos, atan2

def test():
    ob = bpy.data.objects['Cube']
    for co in (v.co for v in ob.data.vertices):
        angle = atan2(co.y, co.x) + .05
        co.x = cos(angle) * 2**.5
        co.y = sin(angle) * 2**.5

bpy.app.driver_namespace['test'] = test

You can do:
import bpy
from math import sin, cos, atan2

def test(scene, depsgraph=None):
    ob = bpy.data.objects['Cube']
    for co in (v.co for v in ob.data.vertices):
        angle = atan2(co.y, co.x) + .05
        co.x = cos(angle) * 2**.5
        co.y = sin(angle) * 2**.5

listeners = bpy.app.handlers.frame_change_pre
listeners.clear()  # remove old handlers before adding updated versions
listeners.append(test)

(1 last line changes to 3 last lines; added arguments to the function so it's compatible with a listener interface)
Of course there may be better ways to approach your problem. For a cube or other simple meshes you could create a shape keys for each vertex (and for each axis perhaps) and then control the shape keys with drivers. This could all be set up with the Python script, that would only need to be run once, and then you would have a setup you can easily share without others needing to run a Python script or trust you.
And of course geometry nodes is a recent possibility that should work for something as simple as moving vertices.
If you don't want it for an animation
Here's another handler, that can be used without animation:
import bpy
from math import sin, cos, atan2
from bpy.types import SpaceView3D

last_value = None

def test():
    global last_value
    ob = bpy.data.objects['Cube']
    # if ob['prop'] == last_value:
    if ob.location.xyz == last_value:
        return
    for co in (v.co for v in ob.data.vertices):
        angle = atan2(co.y, co.x) + .05
        co.x = cos(angle) * 2**.5
        co.y = sin(angle) * 2**.5
    last_value = ob.location.xyz
    # last_value = ob['prop']

try:
    SpaceView3D.draw_handler_remove(SpaceView3D.my_handler, 'WINDOW')
except (AttributeError, ValueError):
    pass

SpaceView3D.my_handler = SpaceView3D.draw_handler_add(test, (), 'WINDOW', 'PRE_VIEW')

I added a custom property (with default name) to the object, and update the vertices only if it changes (though the position of vertices don't depend on it, they probably should... So e.g. angle = ob['prop']) - keep in mind you need to add a custom property to the object to make it work:

Of course you don't need to use a custom property, and as visible in Jhon's Paul edit, you can instead use something like location...
You could also use Message Bus but I often find it problematic (e.g. with custom properties).

Thanks for your clear and detailed answer. I was in fact aware of the frame change handler, however assuming I understand it correctly, it is not helpful in my case. It's not animating that I'm after but interaction: I want a simple way to physically change a parameter and interactively see my 3d graph change in the viewport. If only there was a handler that is triggered when a specific object is moved or an attribute is changed..

This does work btw, if one just lets the animation run indefinitely, but it feels contrived as a solution and it makes the cpu run continuously because the update function runs all the time...

@JhonPaul see edit.

Wow thanks, this works, and I would never have found it by myself! I did search for blender handlers but I don't think it ever came up. Only issue is it doesn't recognize ob['prop'], so instead I saved list(ob.location) in last value. Maybe just ob.location would have sufficed, I settled for the first thing that worked. Oh, and in the try, WINDOW should be in parenthesis. I'm a newbie, not sure if I can edit the answer myself, will try.

@JhonPaul yea, sorry for unquoted WINDOW, as for converting the location to a list, I think using .xyz is more explicit, also a .copy() could be used to get a Vector instead of a tuple of coordinates.


text:
Surface shading in Solid Viewport is broken: blender
I consider myself quite experienced w/ Blender, yet have never encountered the problem, as seen in the image, before.

Here are some details, hopefully to provide more clarity concerning my problem:

The mesh is shaded Flat, yet it has notably incorrect 'smoothed' shading.
The mesh is divided into individual Islands. These Islands do intersect w/ each other.
The most recent Islands suffer the most.
I have attempted to append the mesh into an older version of blender (2.93), and the problem persisted.
I have ensured all normals face outward, with no irregularities.
Some doubles do exist throughout the mesh, only because of the aforementioned division into Islands.

Does anyone know how I might fix this?
Edit: Here is the offending Mesh: https://drive.google.com/file/d/19jdwPf6Y-wI-yJB4AzF5jImSvhtUT7j3/view?usp=sharing

please provide blend file to check it out

If this is a model imported from another source, go to mesh properties > Normals > Clear custom split normals

The model has custom per-face-corner normals that are overriding the flat-shaded normals.  You can discard these, as Gorgious offered, by Clear Custom Split Normals in properties/object data/geometry, or you can tell Blender not to use them by disabling Autosmooth in properties/object data/normals.


text:
Send Geometry nodes value into Shading tab
Blender 3.0 . I've made a offsetting geometry instances using geometry nodes(sorry, I had no idea how to explain expect the image below.)

I wanna use the Z value (used for offsetting instances) in the Shading tab so that each instance have a different emission strength value.
How can I get this Z value into my shading tab? Please consider that this value is gonna be different for the instances, I don't want a single value for the emission strength. Thank you
(I'm going for entirely procedural so please avoid manual cheating)

Here's the file. Open it, the two yellow reroutes should be connected.
(edited) Please 3.0 not 3.1 alpha

Added more explanation and the .blend file. Thank you all

In Blender 3.1 alpha, you can use this node setup:

Note that is important to set the capture attribute node to instance.

There's no "instance"!!! there's just point, edge, face, face corner and spline. Why is it like that? Are you using 3.0 or higher?

Yep, newest Blender 3.1 alpha

Thanks. I upvoted but not accepted. I hope someone finds a 3.0 solution.

@BarbodM this should be helpful: https://blender.stackexchange.com/a/245858/60486

With a couple of tweaks his answer is still valid for 3.0. Move the Capture Attribute node to after Realize Instances. Set it to "Face", and do the same to the Output attribute. You could also use "Float" there since you only want the Z, cutting the Separate XYZ from the material. For the Capture input you'll use a Position node with Separate XYZ depending on the data type you chose. Please note the Z data for each object is a gradient based on the surface position in the world, not a solid value tied for each object. You didn't specify what you need in your question.

Thanks! I feel like I'm still missing what connects the two. There's an "Attribute" node in the shader, but how does it know which attribute to get? What if I have two?

I figured it out! You specify an output name in the Geometry Nodes, then specify the name to use on this object in the modifier, and specify it for the shader too. It's working!

I had a similar problem with Blender 3.1. No idea why, but apparently when you generate new geometry with geometry nodes and don't add the original input at the end, things get weird. See these setups - I just change the connections to "Join Geometry" and depending on that, the attribute either works or it doesn't...

It works as it's supposed to. In your first setup the cube is made procedural and no material has been assigned to it, that's why it's not green. Use a set material node at the end of the geometry node setup. and about the join geometry node, it joins all objects to the first object in it's inputs. That's why the material is different in the last two setups.

Hey, but I'm setting the material index to 1 in every case. Shouldn't this do the same thing? Also, I remember that the Set Material node didn't work either...
I mean, my problem is: the material works, the attribute doesn't.


text:
Can you randomize the triangles of an icosphere?
Im really struggeling with getting this triangular structure to work.

Its like half an icosphere but with randomised vertices.

I already tried editing the vertices with random-proportional editing and then do a limited dissolve.
But this only works to a limit and gives something like this

If anyone knows a quicker solution than" do it by hand" id be so glad.
Please halp.
Edit:
Haunt_House`s answer worked perfectly

that upper image is really difficult to understand... blurred or out of focus, dark... !

You can also try using dyntopo sculpting for this if you want more control (you can paint triangle density)

I'm not at all sure whether it will achieve the desired result since for some reason the image above is so blurry that I can't really see what the goal is, but here's how you can randomize the sphere.

Create an Icosphere and enter Edit Mode.
Keep the 3D-cursor in the center and set the pivot point to 3D-cursor
Use A to select nothing and then from the select menu choose Random Select.
Hit RR to enable trackball rotation and slightly move the verts. Since it's rotating around the center, the mesh stays spherical.
Repeat those steps (deselect, random select, trackball rotation) until everything is random enough.

Another way is to start with a level 1 Icosphere.

Subdivide it with W1. Set the fractal value in the Redo panel to about 3. This adds noise.
Space "to sphere" 1Return. The 1 makes sure it's truly spherical again. You can skip that part but the risk of getting overlapping verts becomes higher.
Repeat the previous two steps 2 or 3 times.

One is glad to be of service.

An easy way to get random triangles on any geometry is to start from a highly subdivided object and apply a Decimate modifier.
You will get nice regular triangles with the Collapse option. Use the Ratio to tweak the number of final faces.

BMesh Version
Create an icosphere using bmesh. Each vertex is then randomly rotated some amount from 0 to a maximum angle about a random axis.

Result of running script, with from left to right, 3, 4 and 5 degree maximum angles.
import bpy
import bmesh
from mathutils import Matrix
from math import radians
from random import uniform

context = bpy.context
# icosphere parameters, edit to suit.
diameter = 1
subdivisions = 4
max_angle = radians(5) # 5 degrees
bm = bmesh.new()

bmesh.ops.create_icosphere(bm,
       subdivisions=subdivisions,
       diameter=diameter)

# randomize
for v in bm.verts:
    axis = [uniform(-1, 1) for c in "xyz"]
    rot = Matrix.Rotation(uniform(0, max_angle), 3, axis)
    v.co = rot * v.co

me = bpy.data.meshes.new("RandomIco")
ob = bpy.data.objects.new("RandomIco", me)
bm.to_mesh(me)
context.scene.objects.link(ob)

Alternatively rather than create an icosphere, can use in edit mode on any mesh to randomly move the radial from origin to vertex, keeping the distance (radius) same.
Result of running a 1 degree random move about 10 times on selected vertices of half icosphere

import bpy
import bmesh
from mathutils import Matrix
from math import radians
from random import uniform

context = bpy.context
ob = context.edit_object
me = ob.data
# randomise parameters

max_angle = radians(1) # 5 degrees
bm = bmesh.from_edit_mesh(me)
# randomize
for v in bm.verts:
    if not v.select:
        continue
    axis = [uniform(-1, 1) for c in "xyz"]
    rot = Matrix.Rotation(uniform(0, max_angle), 3, axis)
    v.co = rot * v.co

bmesh.update_edit_mesh(me)
me.update()

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/


text:
More noise WITH Light-Portals?
I built a scene to test light portals.
I use a very bright HDRi to light the scene.
And used a closed cube with a very tiny hole, for the light to shine through.

The brighter the light, and the tinier the hole, the more noise you get.
Material is a basic white diffuse node.
In this test-scene an activated light-portal produces MORE Noise at the same sample-count (1000 samples)

What is happening ?
I thought Light-portals ALWAYS reduce the noise at the same sample count?

Everything is laid out to produce as much noise as possible..... this tells nothing about the scene itself or it's setup. Yes, portals should help reduce noise, but 200 samples is not alot, and may not show much improvement depending on the specific scene and it's setup, lighting, and materials of which we have no information. Please edit your question and add more clarifying information.

i edited it. But i dont get how it would improve my question. Its about the fact that i can built a scene that "brakes" the function, a light portal should have. Not that i need a solution for this particular scene.

Light portals don't always reduce the noise of a scene like this. They usually do, but not always. I do not know under what condition they do or don't but I do know that even for interior scenes they don't always help.

If you turn diffuse bounces to 0 (disabling indirect light), the source of the mystery reveals itself.
Here's 100 samples with no portal, and no diffuse bounces:

And the same, but with the portal:

So why is the full scene noisier when we turn on diffuse indirect light? The portal INCREASES the amount of light on each sample, thus increasing the number of diffuse bounces that return something instead of nothing. So you get more noise there. The combination of the small window and white walls mean the scene is almost entirely indirectly lit.
There's a few things you can do to speed this up. First of all, the portal is much bigger than the window. Shrink it to exactly the size of the window. And while we're at it, throw a solidify modifier on your room cube, that way you don't get the weird light leaks at corners. That's imperfect though, so you'll need to fake a lot more than that. Time to stop world indirect light entirely. Go to the world panel, and change bounces to 0:
The portal will still throw sunlight on the wall, but it won't keep bounceing around and making a ton of noise.
Finally, replace the missing lighting by making a copy of the portal (leave it in the exact same place), disable the portal option so it's a regular area light, and give it a sky color. Adjust power to taste. That gets the indirect lighting clean enough that the denoiser can take care of the rest. You can disable desnoising on all passes except diffuse indirect if you like:

And the result of all that, same 100 samples:

You don't have to use ALL these techniques of course, you use just some to get more realism at the cost of render time. For example, you could set world bounces to 1 instead of 0. Play around to get the performance/quality balance that works for your shot.

Thanks so much for the detailed answer. I usally dont care about render time, and go for the realism route and therby ignore reducing bounces or simplifying the scene. Im currently just doing a tutorial in which im also mentioning ways to reduce noise and fireflies, and was gonna mention light portals. And before i put it out there, i wanted to be sure, i knew what was going on with them. Thanks again so much :)

Love it. Great explanation!

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/


text:
Is there a better way to make complex cloth, than sculpting it?
I want to make this exact white blanket.

How would you go about creating such a fluffy, extremly wrinkled blanket.
I went through some tutorials, but they only deal with very simple blankets.
I would like to get it to like 80% before starting to make the details with sculpting. The smaller blankets on top should fall into place much easier, once the big white one is done and can function as a collision object.
I also want to constrain myself to blender and dont want to do it in marvelous or etc.
Edit:
Rigg Riggs answer works perfectly as startingpoint.

You can rotate the imageplane used for the displacement-texture to control the direction of the patter without messing it up . Thats how i got it to go diagonally.
I also used two diffuse shaders (b/w) in a mix, controlled by the noise texture, instead of his node setup. Seems to work better. At least for me.
Had to play around with the settings a bit before getting a texture to my liking.
I added a decimate modifier set to un-subdivide and a triangulate modifier  once i applied the displacement, to reduce the face-count.
If you have a different approach please feel free to share it. Im trying to learn :)

you could also change the Rotation >> Z property on the Mapping node to get your rotation on the texture image itself.

doesnt work if you scaled it

Render out a texture on plane similar to the following & save the image:

Add a plane to the 3D view > subdivide it like crazy (W >> S)
Add a Displacement Modifier
Create a new texture from here.
Go into the textures tab on the properties panel and set the texture to your rendered out image location on disk.
Come back to the modifiers tab and play with your settings, start with mine here and adjust to your liking.
finally add a subsurf modifier
Last apply the subsurf modifier, then the displacement modifier.
Then go into sculpt mode and have your way with it.

One important mention, set your render engine to cycles before trying to create the texture in this answer.

Interesting Solution to this problem. Will try to remember it for the future.

Might also note that going too crazy with subdivides on some machines may cause performance issues with attempting to sculpt afterward.

I`ll try this. It looks really promising. And much faster than doing it with cloth. Thank you :). Will update my question with results


text:
Dashed link lines in node editor
While testing a change to an add-on that automatically creates node groups I noticed that the links in the group in the Geometry Node Editor window were dashed instead of solid. It seems to be related to the input group - so that the links proliferate through the tree - as they revert back to being continuous when not linked to the Node Group Input node as demonstrated in this animated image :

Iinitially thought I'd managed to manually create the node group without having the same problem but on re-trying it does seem to occur with manually created groups (so perhaps it's not my code after all!). Presumably, this behaviour is intentional and indicating something.
The nodes still seem to work as expected and produce the same output. What do these dashed links indicate? I haven't spotted the same happening in the Shader or Compositor node editor windows so maybe this is Geometry Node related only.
Note that this was on Blender version 3.00 (I know - it's an unfinished development release... perhaps this is just a new feature...?)

This is something new for 3.00 as of change T91563 and the Release Notes report that

Dashed lines are used to represent the flow of functions while data-flow node links look the same as before

The feature is meant to support the field rewrite of Geometry Nodes.
This has been a very controversial choice and there is massive user feedback on devtalk, but it is unlikely that this will change.

Thanks @Marty - that’s really helpful info. I can see why highlighting this might be useful and have noticed that if you hover over the ‘data’ sockets you get a display of the value at that point, which is quite helpful when you know about it. I do think the choice of dashed line is a bad one though - it gives the wrong impression as I thing the ‘function’ dataflow should be highlighted as somehow stronger since there is more content, rather than weaker as it seems with dashed lines. Different colours would have been sufficient (blue/green, blue/cyan, green/yellow or something like that).

The most common complaint on Devtalk is precisely what you said, so there's some hope that this will change in future.  Of course, the problem with using colors is that they introduce their own set of readability issues, especially for the color blind.  (The principle cause of problems is solutions.)

It seems to be an early attempt to distinguish function flow from data flow.
Quoting the relevant developer task:

The "data flow" is evaluated at every single node. A user can inspect
the output sockets of those nodes and have a glimpse at their values.
The "function flow" (nodes) however is only evaluated in the geometry
nodes. The noodles are not transporting data in the same sense of the
"data flow". All that can be inspected are the attributes the functions
depend on.

The project seems to be abandoned now, or at least stagnant

Thanks @Duarte - that’s really helpful info. IMO the dashed line is the wrong and confusing choice for this but I can see why it’s useful to distinguish them - and do like the new hover-over display of the data at a socket. Different colours would probably be clearer, less confusing and easier to implement. Hope you don’t mind me marking Marty’s answer as accepted - the two are very equal and so I chose based on who’d gain the most from the reputation points! :-)

No problem, seems fair. From my superficial understanding it was quite a controversial change it might not be kept in the long run

I noticed in the new 3.00 build the link lines take on the colour of the socket throughout all the node editors. Must say I like the updated node editors.

Thanks for the reminder almost forgot to download it, gotta give it a try, haven't really played with 3.0 yet

What do these dashed links indicate?

Difference between plain and dashed links
The simple answer is: Plain lines are used for links returning constant values and dashed lines for links returning variable values:

Unfortunately the documentation introduces fancy historical concepts "field" and "function flow" which today (version 3.1) add nothing for the learner but blur everything.
In your case
You had a dashed line between your two Add nodes because your group output was expecting a variable value, so the inputs of the second Add were expected to be variable too, and similarly the inputs of the first Add.
As soon as you disconnect the first Add inputs, this node can only provide a result based on the preset values 0.5 and 0.5, this result is a constant (1.0). Hence the link between the two nodes now depicts a constant value link.
Note when only one input is disconnected, the output can still be variable, and the link is still a dashed one.

Details
In the geometry node editor a link between two nodes, whatever its nature, is the visual depiction of method calls between node objects (in the object-oriented programming sense) in the underlying program.
When connecting two nodes, we actually instruct the caller node (the one with the input) to call a method of the callee node (the one with the output) to get a value. The call may or may not require additional information, this is what the plain/dashed line depicts:

Constant value: Each time a value is needed by the caller, it is provided the same value by callee. This requires no additional information from the caller.

Variable value: Each time a value is needed by the caller, the caller provides one or more parameters to the callee. The callee computes a value based on the parameters (using some internal function indeed):

Interest of a variable value
The interest for a variable value is to be compatible with nodes which process multiple elements (vertices, faces, instances, ...) in a sequential way. Such node is able to process each element differently as long as its inputs are able to provide different values, one value for each processed element.
Example: Individual scale for each instance
E.g. the Instance On Points node is used to create instances of some secondary object for each vertex of the main object. This node doesn't process all "points" (vertices) simultaneously, the node starts a loop and processes one vertex at a time during each iteration of the loop:

It requests the geometry of the secondary object to a provider (e.g. a UV Sphere node). It also see if this newly created instance should be adjusted. For instance it looks for an individual scale factor on the Scale input:

If the Scale input is connected to a scale provider, it calls the provider method associated with the connected provider output. If the provider is able to deliver a variable value, the node provides a parameter in the call: An incremental index, therefore different for each call.

The provider node method computes a variable value based on the parameter provided in the call, and returns this specific value.

The caller node uses this specific value to scale the specific instance.

The next vertex is processed in a new iteration of the loop until all vertices have been processed. The caller node job is then done but will be restarted whenever one of its inputs is updated, including when only one of a variable value input is updated (this monitoring task is part of the node event system).

Documentation
This notion of call is essential to understand the difference between constant and variable value. It's what the documentation tries painfully to describe referring to esoteric wording "field" and "function flow" and plenty of arrows suggesting something is flowing between nodes.

This "flow" just corresponds to the calls and the returned values.
It is easier to understand when simply stated this way: Links are calls, plain links are associated with parameter-less calls and constant values, dashed links are associated with parametrized calls and variable values.

Excellent explanation in everyday language!! Thanks to your clear explanation and the simple examples I got it all right!, without any fancy confusing words. BRAVO AND THANK YOU SO MUCH


text:
my model (sink) is rendering deformed, its fine in other views
it was fine yesterday and i can't figure out what ive done
https://drive.google.com/file/d/1y3f6QZE_rYek0mwWIpD-GCzjDYRKPIoo/view?usp=sharing

Please clarify your specific problem or provide additional details to highlight exactly what you need. As it's currently written, it's hard to tell exactly what you're asking.

Hello and welcome. While files, images, and external videos or links may be helpful additions they should not be the only way to obtain information about your issue. Don't make understanding your question rely on downloading a file, watching a video or visiting an external site. Use the builtin tools to upload images or gifs, along with thoroughly explaining the problem in written form so it can be indexed and searched for thus helping future visitors with similar issues.

Your displacement values on this material are extreme, decrease them to something low like 0.01.

cheers Yousuf! its always something so obvious.


text:
"Generate rig" only creates the floor arrows, nothing else (blender newb)
I've been trying to figure this out for several days now but nothing online is helping so I'm just going to ask specifically and hope this helps. I am currently creating a low poly giraffe and would like to animate it. I created armature and parented it so the mesh does move properly when I move the bones. But when I try to generate the rig, it doesn't create those loops and stuff. It only shows the circle on the floor with the four arrows. I have tried all sorts of stuff but for the life of me can't figure out how to do this. Hopefully someone can help me out, it would be much appreciated:) (Beware, I've clicked quite a few things in the program which may have cluttered stuff and made it more confusing idk)

https://pasteall.org/media/c/e/ce6197df80e7663b24c12436cbbf6727.blend

We'd need to see the Blend file upload here to see what's going on.  I'm not an expert on armatures but my first thought on seeing yours is that every bone in it is facing in the wrong direction!

Maybe to clarify that a bit to a newby, the starting point of the rig for humans is usually just below the 'groin' area, the part you like to keep at a certain height, while you be able to pose the head, and legs. So start with a single bone there, from where you can extend to all body parts.  Tip to place bones more easy, use magnetic snapping to center (on top you'll find a grayed out magnet symbol woith various options)

Meta-Rigs
Rigify uses the so-called Meta-Rigs to generate the actual rig. The Meta-Rigs is used to tell Rigify where the bones are located and how your model looks like.
The generation of the rig fails because you try to create a metarig armature from scratch and haven't defined any of the needed rig types for the bones. These define various parts of the rig (leg, spine, neck, face, tail, etc). It's a kind of module/building block and the metarig object is built from these.
Long story short, you don't need to create a Meta-Rig from scratch because there are predefined Meta-Rigs. Use one of these and adjust it to your model.
I would choose the Horse for the giraffe:

This gives you a skeleton of a horse:

Now, scale it a bit down so the legs have roughly the same height. Apply the Scale with Ctrl+A.
Switch to Edit mode, and move the bones. You can select the linked ones with L if you select one and hover the mouse over it.

Do not delete single bones! You need to delete the whole rig type. Better just move them into position even if you don't need them.
Beware, the neck and the spine are not connected. (3D Cursor in the screenshot). But these bones must stay together else the generation of the rig will fail with an error. Use Lasso or Box selection to select them both.
If you have separated them accidentally you can use the 3D cursor (Shift+S) to move the head of the neck.001 bone to the tail of the spine.006 bone.
(This is the very first giraffe I've rigged. The layout of the bones might be not correct.)
Finally, generate the rig armature and bind the mesh to it (Ctrl+P, Parent To > With Automatic Weights).


text:
How do I add a texture for procedural materials as seen in this video?
So I am watching a procedural material tutorial video on Youtube. In the beginning, the creator has a tile-like texture in the background of his object, which is the plane. When he adds the Magic Texture and Displacement node, the image is placed and duplicated onto the plane. I am not understanding how this is working. In other words, how do I add a texture in this case so that when I do the nodes, it places itself and duplicates onto the plane as shown in the video. So far, I have added the Magic Texture and Displacement node as shown in the video and my plane is blank. Nothing changed after adding the first two nodes as it did for the creator in the video.
Here's the video: https://www.youtube.com/watch?v=muvIS5_sXQo
and here's my file.. there's really not much done to this file but:
and a screenshot of my nodes:

hello, please share your file: https://blend-exchange.com/

..You can take a screen-grab of your node setup, and edit it into your question. It's very hard to guess what might be going wrong, with no evidence at all.

blend file and screenshot has been added.

You can't get the same result if you don't follow the instructions, maybe he missed some explanation but for example you need to be in Cycles, you need to subdivide your mesh, you need to be in Rendered preview, you need to go into the Material panel > Settings > Surface > Displacement > choose Displacement Only, etc


text:
Create a displacement map from high-res terrain to use on low-poly terrain
I have a high and low poly version of a terrain. The idea is this
low_poly_terrain + displacement.exr  =  high_poly_terrain
I want an displacement images map that I can apply to the low poly terrain so that at render time the two are indistinguishable.

Alright it took me some time but I figured it out.

The end result will look better if we use plane instead of a low poly version of the terrain.
A. messed up version

B.Replace the low poly version with simple plane (keep it in the same place though)

So, with the plane selected, move the plane below the high poly version.

Select the plane and assign a material to it, the default material will do. Next go to the texture tab and create an image. Change the resolution to something you want. Also enable 32 bit float for precise displacement.

Next up, unwrap the plane (edit mode > top view > unwrap > project from view (bounds)). Make sure in the uv window you select the displacement

Next up, bake settings. Make sure you're using Blender Internal, not Cycles. Set the Bake mode to Displacement. Enable Selected to Active and set the distance to the distance between the plane and the highest point of the high poly mesh ( I just eyeballed it), 0.300 in my case.

Final Result

You could easily create a height map from the high poly terrain by getting a ZDepth pass from a top-down render.

Hide the low poly version of terrain
Create a camera centered above your terrain looking directly down
Set your camera to Orthographic and adjust the scale parameter to fit the terrain
Under the Properties Window>Render Layers>Passes disable all passes except Z
Render the and open the node editor under Compositing mode
Add a Vector Normalize to the Z output of render layers and save the resulting image

See camera to the left, node setup to the center, and camera settings above the render passes to the right.
It wont be an HDR image but that seems overkill anyway unless we are talking about a very very large height differential.
Anyway this all seems very unnecessary, you may be confusing what a displacement map does. Displacement by itself only changes the shape of an object, not it's topology so it won't be adding any more detail to your terrain, unless you add more geometry which would defeat the purpose.
Since your lowpoly terrain already as the correct shape it's redundant to displace it, also depending on the nature of your final render having an additional texture to load, plus a displacement to calculate may not be beneficial at all as opposed to just loading a few more polygons.
What you may want here is a normal map of your high-poly terrain that simulates more intricate details without the additional geometry, in which case you would use the "Normal" pass in the Properties Window>Render Layers>Passes instead of "Z" as shown in the screenshot