How can I tell what a particular key combination will do in Blender 2.92 I'm very new to Blender and I've installed the latest version (2.92).  The learning process is extremely hard because all the tutorials I can find seem to have been created under a version that has a completely different keyboard mapping.  So trying to follow them produces lots of unexpected results under this version.
The problem raises 2 questions:

Is there any way I can tell exactly what a given keystroke actually does? For example in Emacs I can type C-x h [mystery chord] and help on whatever would be executed by the chord pops up. Or in Visual Studio I can go to the keyboard mapper and try to map the chord and it will tell me what function (if anything) is already using that chord.

Given a demo of someone hitting a given chord in a prior version, how can I discover what keys are required to do it in 2.92?

I did find 'Is key Free' under Preferences | Add-ons but it either doesn't work in 2.92 or I simply can't find where it presents itself in the 2.92 UI.

'Is key Free' really does work.  I was just too green to find it once activated.  To find it:

Use the 'Editor Type' dropdown on any window's title bar to select 'Text Editor'.  (Look at the float-over text first to see it's current type to simplify restoration of old content when done.)
In the text editor window, pull down the View menu and insure "Sidebar" is checked
On the right side of the window, click the 'Dev' sidebar tab
'Is key Free' should be on the now active sidebar.

Being a programmer rather than an artist I hacked the code up to give more(useful) info.  The version below, by default, works identical to the original but has 2 extra buttons.  They turn on 'internal values' in 'List all Shortcuts' output.  So, for instance, you can see the difference between the two Render hotkeys.
Default output example:
Render --------------------------- Ctrl F12
Render -------------------------------- F12

With the [Params] toggle on:
render.render(animation=1,use_viewport=1) ---- Ctrl F12
render.render(use_viewport=1) --------------------- F12

As for mapping hotkeys from versions less than 2.8 to those of 2.8 and above, it seems the only way is to look something up in the old version and use output from this to find it in the newer version.
It's not perfect.  It doesn't translate enums to text.  But these updates should make telling one otherwise identical call from another easier to map.
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation,
#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####

# PEP8 compliant (https://www.python.org/dev/peps/pep-0008)

bl_info = {
    "name": "Is key Free",
    "author": "Antonio Vazquez (antonioya) + Rick Bielawski",
    "version": (1, 2, 0),
    "blender": (2, 80, 0),
    "location": "Text Editor > Sidebar > Dev Tab",
    "description": "Find free shortcuts, inform about used and print a key list",
    "doc_url": "{BLENDER_MANUAL_URL}/addons/development/is_key_free.html",
    "category": "Development",
}

import bpy
from bpy.props import (
    BoolProperty,
    EnumProperty,
    StringProperty,
    PointerProperty,
)
from bpy.types import (
    Operator,
    Panel,
    PropertyGroup,
)

# ------------------------------------------------------
# Class to find keymaps
# ------------------------------------------------------

class MyChecker():
    lastfind = None
    lastkey = None
    mylist = []

    # Init
    def __init__(self):
        self.var = 5

    # Verify if the key is used
    @classmethod
    def check(cls, findkey, ctrl, alt, shift, oskey):
        if len(findkey) > 0:
            cmd = ""
            if ctrl is True:
                cmd += "Ctrl+"
            if alt is True:
                cmd += "Alt+"
            if shift is True:
                cmd += "Shift+"
            if oskey is True:
                cmd += "OsKey+"
            cls.lastfind = cmd + findkey.upper()
            cls.lastkey = findkey.upper()
        else:
            cls.lastfind = None
            cls.lastkey = None

        wm = bpy.context.window_manager
        mykeys = []

        for context, keyboardmap in wm.keyconfigs.user.keymaps.items():
            for myitem in keyboardmap.keymap_items:
                if myitem.active is True and myitem.type == findkey:
                    if ctrl is True and myitem.ctrl is not True:
                        continue
                    if alt is True and myitem.alt is not True:
                        continue
                    if shift is True and myitem.shift is not True:
                        continue
                    if oskey is True and myitem.oskey is not True:
                        continue
                    t = (context,
                         myitem.type,
                         "Ctrl" if myitem.ctrl is True else "",
                         "Alt" if myitem.alt is True else "",
                         "Shift" if myitem.shift is True else "",
                         "OsKey" if myitem.oskey is True else "",
                         myitem.name)

                    mykeys.append(t)

        sortkeys = sorted(mykeys, key=lambda key: (key[0], key[1], key[2], key[3], key[4], key[5]))

        cls.mylist.clear()
        for e in sortkeys:
            cmd = ""
            if e[2] != "":
                cmd += e[2] + "+"
            if e[3] != "":
                cmd += e[3] + "+"
            if e[4] != "":
                cmd += e[4] + "+"
            if e[5] != "":
                cmd += e[5] + "+"

            cmd += e[1]

            if e[6] != "":
                cmd += "  " + e[6]
            cls.mylist.append([e[0], cmd])

    # return context
    @classmethod
    def getcontext(cls):
        return str(bpy.context.screen.name)

    # return last search
    @classmethod
    def getlast(cls):
        return cls.lastfind

    # return last key
    @classmethod
    def getlastkey(cls):
        return cls.lastkey

    # return result of last search
    @classmethod
    def getlist(cls):
        return cls.mylist

    # verify if key is valid
    @classmethod
    def isvalidkey(cls, txt):
        allkeys = [
            "LEFTMOUSE", "MIDDLEMOUSE", "RIGHTMOUSE", "BUTTON4MOUSE", "BUTTON5MOUSE", "BUTTON6MOUSE",
            "BUTTON7MOUSE",
            "MOUSEMOVE", "INBETWEEN_MOUSEMOVE", "TRACKPADPAN", "TRACKPADZOOM",
            "MOUSEROTATE", "WHEELUPMOUSE", "WHEELDOWNMOUSE", "WHEELINMOUSE", "WHEELOUTMOUSE", "EVT_TWEAK_L",
            "EVT_TWEAK_M", "EVT_TWEAK_R", "A", "B", "C", "D", "E", "F", "G", "H",
            "I", "J",
            "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "ZERO", "ONE", "TWO",
            "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "LEFT_CTRL", "LEFT_ALT", "LEFT_SHIFT",
            "RIGHT_ALT",
            "RIGHT_CTRL", "RIGHT_SHIFT", "OSKEY", "GRLESS", "ESC", "TAB", "RET", "SPACE", "LINE_FEED",
            "BACK_SPACE",
            "DEL", "SEMI_COLON", "PERIOD", "COMMA", "QUOTE", "ACCENT_GRAVE", "MINUS", "SLASH", "BACK_SLASH",
            "EQUAL",
            "LEFT_BRACKET", "RIGHT_BRACKET", "LEFT_ARROW", "DOWN_ARROW", "RIGHT_ARROW", "UP_ARROW", "NUMPAD_2",
            "NUMPAD_4", "NUMPAD_6", "NUMPAD_8", "NUMPAD_1", "NUMPAD_3", "NUMPAD_5", "NUMPAD_7", "NUMPAD_9",
            "NUMPAD_PERIOD", "NUMPAD_SLASH", "NUMPAD_ASTERIX", "NUMPAD_0", "NUMPAD_MINUS", "NUMPAD_ENTER",
            "NUMPAD_PLUS",
            "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15",
            "F16", "F17",
            "F18", "F19", "PAUSE", "INSERT", "HOME", "PAGE_UP", "PAGE_DOWN", "END", "MEDIA_PLAY", "MEDIA_STOP",
            "MEDIA_FIRST", "MEDIA_LAST", "TEXTINPUT", "WINDOW_DEACTIVATE", "TIMER", "TIMER0", "TIMER1", "TIMER2",
            "TIMER_JOBS", "TIMER_AUTOSAVE", "TIMER_REPORT", "TIMERREGION", "NDOF_MOTION", "NDOF_BUTTON_MENU",
            "NDOF_BUTTON_FIT", "NDOF_BUTTON_TOP", "NDOF_BUTTON_BOTTOM", "NDOF_BUTTON_LEFT", "NDOF_BUTTON_RIGHT",
            "NDOF_BUTTON_FRONT", "NDOF_BUTTON_BACK", "NDOF_BUTTON_ISO1", "NDOF_BUTTON_ISO2",
            "NDOF_BUTTON_ROLL_CW",
            "NDOF_BUTTON_ROLL_CCW", "NDOF_BUTTON_SPIN_CW", "NDOF_BUTTON_SPIN_CCW", "NDOF_BUTTON_TILT_CW",
            "NDOF_BUTTON_TILT_CCW", "NDOF_BUTTON_ROTATE", "NDOF_BUTTON_PANZOOM", "NDOF_BUTTON_DOMINANT",
            "NDOF_BUTTON_PLUS", "NDOF_BUTTON_MINUS", "NDOF_BUTTON_ESC", "NDOF_BUTTON_ALT", "NDOF_BUTTON_SHIFT",
            "NDOF_BUTTON_CTRL", "NDOF_BUTTON_1", "NDOF_BUTTON_2", "NDOF_BUTTON_3", "NDOF_BUTTON_4",
            "NDOF_BUTTON_5",
            "NDOF_BUTTON_6", "NDOF_BUTTON_7", "NDOF_BUTTON_8", "NDOF_BUTTON_9", "NDOF_BUTTON_10",
            "NDOF_BUTTON_A",
            "NDOF_BUTTON_B", "NDOF_BUTTON_C"
            ]
        try:
            allkeys.index(txt)
            return True
        except ValueError:
            return False

mychecker = MyChecker()  # Global class handler

# ------------------------------------------------------
# Button: Class for search button
# ------------------------------------------------------
class RunActionCheck(Operator):
    bl_idname = "iskeyfree.action_check"
    bl_label = ""
    bl_description = "Verify if the selected shortcut is free"

    # noinspection PyUnusedLocal
    def execute(self, context):
        scene = context.scene.is_keyfree
        txt = scene.data.upper()
        global mychecker
        mychecker.check(txt, scene.use_crtl, scene.use_alt, scene.use_shift,
                        scene.use_oskey)

        return {'FINISHED'}

# ------------------------------------------------------
# Defines UI panel
# ------------------------------------------------------
class UIControlPanel(Panel):
    bl_idname = "DEVISKEYFREE_PT_ui"
    bl_space_type = "TEXT_EDITOR"
    bl_region_type = "UI"
    bl_label = "Is Key Free"
    bl_category = 'Dev'
    bl_options = {'DEFAULT_CLOSED'}

    # noinspection PyUnusedLocal
    def draw(self, context):
        layout = self.layout
        scene = context.scene.is_keyfree

        row = layout.row(align=True)
        row.prop(scene, "data")
        row.operator("iskeyfree.action_check", icon="VIEWZOOM")

        row = layout.row(align=True)
        row.prop(scene, "use_crtl", toggle=True)
        row.prop(scene, "use_alt", toggle=True)
        row.prop(scene, "use_shift", toggle=True)
        row.prop(scene, "use_oskey", toggle=True)

        row = layout.row()
        row.prop(scene, "numpad")

        layout.operator("iskeyfree.run_export_keys", icon="FILE_TEXT")

        row = layout.row(align=True)
        row.prop(scene, "report_params", toggle=True)
        row.prop(scene, "report_keyname", toggle=True)

        global mychecker
        mylist = mychecker.getlist()
        oldcontext = None

        box = None
        if len(mylist) > 0:
            cmd = mychecker.getlast()
            if cmd is not None:
                row = layout.row()
                row.label(text="Current uses of " + str(cmd), icon="PARTICLE_DATA")
            for e in mylist:
                if oldcontext != e[0]:
                    box = layout.box()
                    box.label(text=e[0], icon="UNPINNED")
                    oldcontext = e[0]

                row = box.row(align=True)
                row.label(text=e[1])
        else:
            cmd = mychecker.getlast()
            if cmd is not None:
                box = layout.box()
                if mychecker.isvalidkey(mychecker.getlastkey()) is False:
                    box.label(text=str(mychecker.getlastkey()) + " looks not valid key", icon="ERROR")
                else:
                    box.label(text=str(cmd) + " is free", icon="FILE_TICK")

# ------------------------------------------------------
# Update key (special values) event handler
# ------------------------------------------------------
# noinspection PyUnusedLocal
def update_data(self, context):
    scene = context.scene.is_keyfree
    if scene.numpad != "NONE":
        scene.data = scene.numpad

class IskeyFreeProperties(PropertyGroup):
    data: StringProperty(
        name="Key", maxlen=32,
        description="Shortcut to verify"
    )
    use_crtl: BoolProperty(
        name="Ctrl",
        description="Ctrl key used in shortcut",
        default=False
    )
    use_alt: BoolProperty(
        name="Alt",
        description="Alt key used in shortcut",
        default=False
    )
    use_shift: BoolProperty(
        name="Shift",
        description="Shift key used in shortcut",
        default=False
    )
    use_oskey: BoolProperty(
        name="OsKey",
        description="Operating system key used in shortcut",
        default=False
    )
    report_params: BoolProperty(
        name="Params",
        description="Report invoked function and params",
        default=False
    )
    report_keyname: BoolProperty(
        name="KeyName",
        description="Report internal key name vs interpreted name",
        default=False
    )
    numpad: EnumProperty(
        items=(
            ('NONE', "Select key", ""),
            ("LEFTMOUSE", "LEFTMOUSE", ""),
            ("MIDDLEMOUSE", "MIDDLEMOUSE", ""),
            ("RIGHTMOUSE", "RIGHTMOUSE", ""),
            ("BUTTON4MOUSE", "BUTTON4MOUSE", ""),
            ("BUTTON5MOUSE", "BUTTON5MOUSE", ""),
            ("BUTTON6MOUSE", "BUTTON6MOUSE", ""),
            ("BUTTON7MOUSE", "BUTTON7MOUSE", ""),
            ("MOUSEMOVE", "MOUSEMOVE", ""),
            ("INBETWEEN_MOUSEMOVE", "INBETWEEN_MOUSEMOVE", ""),
            ("TRACKPADPAN", "TRACKPADPAN", ""),
            ("TRACKPADZOOM", "TRACKPADZOOM", ""),
            ("MOUSEROTATE", "MOUSEROTATE", ""),
            ("WHEELUPMOUSE", "WHEELUPMOUSE", ""),
            ("WHEELDOWNMOUSE", "WHEELDOWNMOUSE", ""),
            ("WHEELINMOUSE", "WHEELINMOUSE", ""),
            ("WHEELOUTMOUSE", "WHEELOUTMOUSE", ""),
            ("EVT_TWEAK_L", "EVT_TWEAK_L", ""),
            ("EVT_TWEAK_M", "EVT_TWEAK_M", ""),
            ("EVT_TWEAK_R", "EVT_TWEAK_R", ""),
            ("A", "A", ""),
            ("B", "B", ""),
            ("C", "C", ""),
            ("D", "D", ""),
            ("E", "E", ""),
            ("F", "F", ""),
            ("G", "G", ""),
            ("H", "H", ""),
            ("I", "I", ""),
            ("J", "J", ""),
            ("K", "K", ""),
            ("L", "L", ""),
            ("M", "M", ""),
            ("N", "N", ""),
            ("O", "O", ""),
            ("P", "P", ""),
            ("Q", "Q", ""),
            ("R", "R", ""),
            ("S", "S", ""),
            ("T", "T", ""),
            ("U", "U", ""),
            ("V", "V", ""),
            ("W", "W", ""),
            ("X", "X", ""),
            ("Y", "Y", ""),
            ("Z", "Z", ""),
            ("ZERO", "ZERO", ""),
            ("ONE", "ONE", ""),
            ("TWO", "TWO", ""),
            ("THREE", "THREE", ""),
            ("FOUR", "FOUR", ""),
            ("FIVE", "FIVE", ""),
            ("SIX", "SIX", ""),
            ("SEVEN", "SEVEN", ""),
            ("EIGHT", "EIGHT", ""),
            ("NINE", "NINE", ""),
            ("LEFT_CTRL", "LEFT_CTRL", ""),
            ("LEFT_ALT", "LEFT_ALT", ""),
            ("LEFT_SHIFT", "LEFT_SHIFT", ""),
            ("RIGHT_ALT", "RIGHT_ALT", ""),
            ("RIGHT_CTRL", "RIGHT_CTRL", ""),
            ("RIGHT_SHIFT", "RIGHT_SHIFT", ""),
            ("OSKEY", "OSKEY", ""),
            ("GRLESS", "GRLESS", ""),
            ("ESC", "ESC", ""),
            ("TAB", "TAB", ""),
            ("RET", "RET", ""),
            ("SPACE", "SPACE", ""),
            ("LINE_FEED", "LINE_FEED", ""),
            ("BACK_SPACE", "BACK_SPACE", ""),
            ("DEL", "DEL", ""),
            ("SEMI_COLON", "SEMI_COLON", ""),
            ("PERIOD", "PERIOD", ""),
            ("COMMA", "COMMA", ""),
            ("QUOTE", "QUOTE", ""),
            ("ACCENT_GRAVE", "ACCENT_GRAVE", ""),
            ("MINUS", "MINUS", ""),
            ("SLASH", "SLASH", ""),
            ("BACK_SLASH", "BACK_SLASH", ""),
            ("EQUAL", "EQUAL", ""),
            ("LEFT_BRACKET", "LEFT_BRACKET", ""),
            ("RIGHT_BRACKET", "RIGHT_BRACKET", ""),
            ("LEFT_ARROW", "LEFT_ARROW", ""),
            ("DOWN_ARROW", "DOWN_ARROW", ""),
            ("RIGHT_ARROW", "RIGHT_ARROW", ""),
            ("UP_ARROW", "UP_ARROW", ""),
            ("NUMPAD_1", "NUMPAD_1", ""),
            ("NUMPAD_2", "NUMPAD_2", ""),
            ("NUMPAD_3", "NUMPAD_3", ""),
            ("NUMPAD_4", "NUMPAD_4", ""),
            ("NUMPAD_5", "NUMPAD_5", ""),
            ("NUMPAD_6", "NUMPAD_6", ""),
            ("NUMPAD_7", "NUMPAD_7", ""),
            ("NUMPAD_8", "NUMPAD_8", ""),
            ("NUMPAD_9", "NUMPAD_9", ""),
            ("NUMPAD_0", "NUMPAD_0", ""),
            ("NUMPAD_PERIOD", "NUMPAD_PERIOD", ""),
            ("NUMPAD_SLASH", "NUMPAD_SLASH", ""),
            ("NUMPAD_ASTERIX", "NUMPAD_ASTERIX", ""),
            ("NUMPAD_MINUS", "NUMPAD_MINUS", ""),
            ("NUMPAD_ENTER", "NUMPAD_ENTER", ""),
            ("NUMPAD_PLUS", "NUMPAD_PLUS", ""),
            ("F1", "F1", ""),
            ("F2", "F2", ""),
            ("F3", "F3", ""),
            ("F4", "F4", ""),
            ("F5", "F5", ""),
            ("F6", "F6", ""),
            ("F7", "F7", ""),
            ("F8", "F8", ""),
            ("F9", "F9", ""),
            ("F10", "F10", ""),
            ("F11", "F11", ""),
            ("F12", "F12", ""),
            ("F13", "F13", ""),
            ("F14", "F14", ""),
            ("F15", "F15", ""),
            ("F16", "F16", ""),
            ("F17", "F17", ""),
            ("F18", "F18", ""),
            ("F19", "F19", ""),
            ("PAUSE", "PAUSE", ""),
            ("INSERT", "INSERT", ""),
            ("HOME", "HOME", ""),
            ("PAGE_UP", "PAGE_UP", ""),
            ("PAGE_DOWN", "PAGE_DOWN", ""),
            ("END", "END", ""),
            ("MEDIA_PLAY", "MEDIA_PLAY", ""),
            ("MEDIA_STOP", "MEDIA_STOP", ""),
            ("MEDIA_FIRST", "MEDIA_FIRST", ""),
            ("MEDIA_LAST", "MEDIA_LAST", ""),
            ("TEXTINPUT", "TEXTINPUT", ""),
            ("WINDOW_DEACTIVATE", "WINDOW_DEACTIVATE", ""),
            ("TIMER", "TIMER", ""),
            ("TIMER0", "TIMER0", ""),
            ("TIMER1", "TIMER1", ""),
            ("TIMER2", "TIMER2", ""),
            ("TIMER_JOBS", "TIMER_JOBS", ""),
            ("TIMER_AUTOSAVE", "TIMER_AUTOSAVE", ""),
            ("TIMER_REPORT", "TIMER_REPORT", ""),
            ("TIMERREGION", "TIMERREGION", ""),
            ("NDOF_MOTION", "NDOF_MOTION", ""),
            ("NDOF_BUTTON_MENU", "NDOF_BUTTON_MENU", ""),
            ("NDOF_BUTTON_FIT", "NDOF_BUTTON_FIT", ""),
            ("NDOF_BUTTON_TOP", "NDOF_BUTTON_TOP", ""),
            ("NDOF_BUTTON_BOTTOM", "NDOF_BUTTON_BOTTOM", ""),
            ("NDOF_BUTTON_LEFT", "NDOF_BUTTON_LEFT", ""),
            ("NDOF_BUTTON_RIGHT", "NDOF_BUTTON_RIGHT", ""),
            ("NDOF_BUTTON_FRONT", "NDOF_BUTTON_FRONT", ""),
            ("NDOF_BUTTON_BACK", "NDOF_BUTTON_BACK", ""),
            ("NDOF_BUTTON_ISO1", "NDOF_BUTTON_ISO1", ""),
            ("NDOF_BUTTON_ISO2", "NDOF_BUTTON_ISO2", ""),
            ("NDOF_BUTTON_ROLL_CW", "NDOF_BUTTON_ROLL_CW", ""),
            ("NDOF_BUTTON_ROLL_CCW", "NDOF_BUTTON_ROLL_CCW", ""),
            ("NDOF_BUTTON_SPIN_CW", "NDOF_BUTTON_SPIN_CW", ""),
            ("NDOF_BUTTON_SPIN_CCW", "NDOF_BUTTON_SPIN_CCW", ""),
            ("NDOF_BUTTON_TILT_CW", "NDOF_BUTTON_TILT_CW", ""),
            ("NDOF_BUTTON_TILT_CCW", "NDOF_BUTTON_TILT_CCW", ""),
            ("NDOF_BUTTON_ROTATE", "NDOF_BUTTON_ROTATE", ""),
            ("NDOF_BUTTON_PANZOOM", "NDOF_BUTTON_PANZOOM", ""),
            ("NDOF_BUTTON_DOMINANT", "NDOF_BUTTON_DOMINANT", ""),
            ("NDOF_BUTTON_PLUS", "NDOF_BUTTON_PLUS", ""),
            ("NDOF_BUTTON_MINUS", "NDOF_BUTTON_MINUS", ""),
            ("NDOF_BUTTON_ESC", "NDOF_BUTTON_ESC", ""),
            ("NDOF_BUTTON_ALT", "NDOF_BUTTON_ALT", ""),
            ("NDOF_BUTTON_SHIFT", "NDOF_BUTTON_SHIFT", ""),
            ("NDOF_BUTTON_CTRL", "NDOF_BUTTON_CTRL", ""),
            ("NDOF_BUTTON_1", "NDOF_BUTTON_1", ""),
            ("NDOF_BUTTON_2", "NDOF_BUTTON_2", ""),
            ("NDOF_BUTTON_3", "NDOF_BUTTON_3", ""),
            ("NDOF_BUTTON_4", "NDOF_BUTTON_4", ""),
            ("NDOF_BUTTON_5", "NDOF_BUTTON_5", ""),
            ("NDOF_BUTTON_6", "NDOF_BUTTON_6", ""),
            ("NDOF_BUTTON_7", "NDOF_BUTTON_7", ""),
            ("NDOF_BUTTON_8", "NDOF_BUTTON_8", ""),
            ("NDOF_BUTTON_9", "NDOF_BUTTON_9", ""),
            ("NDOF_BUTTON_10", "NDOF_BUTTON_10", ""),
            ("NDOF_BUTTON_A", "NDOF_BUTTON_A", ""),
            ("NDOF_BUTTON_B", "NDOF_BUTTON_B", ""),
            ("NDOF_BUTTON_C", "NDOF_BUTTON_C", "")
        ),
        name="Quick Type",
        description="Enter key code in find text",
        update=update_data
    )

class IsKeyFreeRunExportKeys(Operator):
    bl_idname = "iskeyfree.run_export_keys"
    bl_label = "List all Shortcuts"
    bl_description = ("List all shortcuts with their function in a text block\n"
                      "The newly generated list will be made active in the Text Editor\n"
                      "To access the previous ones, select them from the Header dropdown")

    def all_shortcuts_name(self, context):
        new_name, def_name, ext = "", "All_Shortcuts", ".txt"
        suffix = 1
        try:
            # first slap a simple linear count + 1 for numeric suffix, if it fails
            # harvest for the rightmost numbers and append the max value
            list_txt = []
            data_txt = bpy.data.texts
            list_txt = [txt.name for txt in data_txt if txt.name.startswith("All_Shortcuts")]
            new_name = "{}_{}{}".format(def_name, len(list_txt) + 1, ext)

            if new_name in list_txt:
                from re import findall
                test_num = [findall("\d+", words) for words in list_txt]
                suffix += max([int(l[-1]) for l in test_num])
                new_name = "{}_{}{}".format(def_name, suffix, ext)
            return new_name
        except:
            return None

    def execute(self, context):
        wm = bpy.context.window_manager
        scene = context.scene.is_keyfree
        from collections import defaultdict
        mykeys = defaultdict(list)
        file_name = self.all_shortcuts_name(context) or "All_Shortcut.txt"
        start_note = "# Note: Some of the shortcuts entries don't have a name. Mostly Modal stuff\n"
        col_width, col_shortcuts = 2, 2

        for ctx_type, keyboardmap in wm.keyconfigs.user.keymaps.items():
            for myitem in keyboardmap.keymap_items:

                if scene.report_params:
                    desc = myitem.idname if myitem.idname else "Not Available"
                    description = "{}(".format(desc)
                    if myitem.properties:
                        if len(myitem.properties.items()):
                            for prop in myitem.properties.items():
                                description += "{}={},".format(prop[0],prop[1])
                            description = description[:-1]
                    description += ")"
                else:
                    desc = myitem.name if myitem.name else "No Name"
                    description = "{}".format(desc)

                padding = len(description)
                col_width = padding + 2 if padding > col_width else col_width

                short_type = myitem.type if myitem.type else "UNKNOWN"
                is_ctrl = " Ctrl" if myitem.ctrl is True else ""
                is_alt = " Alt" if myitem.alt is True else ""
                is_shift = " Shift" if myitem.shift is True else ""
                is_oskey = " OsKey" if myitem.oskey is True else ""
                if scene.report_keyname:
                    short_cuts = "{}".format(myitem.to_string())
                else:
                    short_cuts = "{}{}{}{}{}".format(short_type, is_ctrl, is_alt, is_shift, is_oskey)

                t = (
                    description,
                    short_cuts,
                )
                mykeys[ctx_type].append(t)
                padding_s = len(short_cuts) + 2
                col_shortcuts = padding_s if padding_s > col_shortcuts else col_shortcuts

        max_line = col_shortcuts + col_width + 4
        textblock = bpy.data.texts.new(file_name)
        total = sum([len(mykeys[ctxs]) for ctxs in mykeys])
        textblock.write('# %d Total Shortcuts\n\n' % total)
        textblock.write(start_note)

        for ctx in mykeys:
            textblock.write("\n[%s]\nEntries: %s\n\n" % (ctx, len(mykeys[ctx])))
            line_k = sorted(mykeys[ctx])
            for keys in line_k:
                add_ticks = "-" * (max_line - (len(keys[0]) + len(keys[1])))
                entries = "{ticks} {entry}".format(ticks=add_ticks, entry=keys[1])
                textblock.write("{name} {entry}\n".format(name=keys[0], entry=entries))

            textblock.write("\n\n")

        # try to set the created text block to active
        if context.area.type in {"TEXT_EDITOR"}:
            bpy.context.space_data.text = bpy.data.texts[file_name]

        self.report({'INFO'}, "See %s textblock" % file_name)

        return {"FINISHED"}

# -----------------------------------------------------
# Registration
# ------------------------------------------------------
classes = (
    IskeyFreeProperties,
    RunActionCheck,
    UIControlPanel,
    IsKeyFreeRunExportKeys,
)

def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.Scene.is_keyfree = PointerProperty(type=IskeyFreeProperties)

def unregister():
    for cls in classes:
        bpy.utils.unregister_class(cls)
    del bpy.types.Scene.is_keyfree


UV maping and textures for low poly mesh I have question about blender UVs. I making a character for game and noticed that my polycount are very high and I will need to retopologize a mesh manually or with addon program. In one video the guy remove the texture and and make his high mesh poly in UV map and add it in low poly and work find. It's posible to UV map the high mesh poly with texture, as a single texture and add it to my low poly mesh or i need remove the texture to bake the effect of high mesh to low? For the moment its easier for me to go with high poly mesh and add textures in difference small part for efect that go with low poly and draw the texture in Mudbox or phototoshop.

Yeah. Basically you need to bake the hi-poly model's texture upon the low-poly model.
So:

retopo your hipoly model to get the lowpoly.
UVmap the lowpoly one and create a new image upon wich you'll bake the hipoly texture. Make sure this is the image asigned to the lowpoly model when you go into edit mode. If it's not, just select it from the dropping menu, it should stay.
with both models in the same location (overlapped) and selected (being the lowpoly the active one), go to properties bar > render > bake. Choose TEXTURE in the bake mode menu, and make sure SELECTED TO ACTIVE is checked. I usually uncheck CLEAR too. And press BAKE.
this way the texture from the hipoly model should be baked upon your new image, using the lowpoly model's UVmap.

hopefully thatll help. Im a noob myself so take that with some reserve tho.


"Boolean" does not create a new faces I cant figured out why a cylinder make a hole in my geometry, when it supposed to be a notch? Why there isn't new faces?

Boolean modifiers are known to cause issues when dealing with non-manifold and/or curvy geometry.

I can't say for sure what exactly what is causing the issue from your screenshot, but I'd guess it has to do with how you constructed it, seeing that your object is named as a plane in the outliner.

Applying a Solidify Modifier before the Boolean Modifier should fix your issue.


How can I hang an object on a rope or cloth simulation I have created a spider's web with cloth simulation, which works well.

I now want to hang objects on this web and simulate the weight of these objects acting upon it.

How can I pin objects to some vertices in the cloth simulation and make the web interact with instances of falling or pinned objects?

As no one could give a complete answer yet, I'll show you an easy hack/workaround that maybe is sufficient to solve your problem:

In my example I have filpped the plane, put it over the cube, made the cube a collision object, made the plane an unpinned cloth, let the cloth fall on the cube and wrap around it, found a keyframe in which the deformation was good, apply it as shape key, rotated back the plane so that the deformation was toward the bottom.

Then I animated the cube with 3 keyframes only: the start, the contact and the bouncing end; turned the second keyframe's interpolation form Beziers to bouncing, adjusted the values.

Then I went to the plane's shape key, set its max to 2 and min to -1, so tho have room for deformations in both directions, set manually a keyframe over every max and minimum of the bouncin curve, adjusted the curve in graph editor (there is more room to further adjust, but I think  it's enough for the tut purposes).

Ten minutes bouncin!


Making the background see-through, with a recticle staying visible I'm modelling a rifle, and am up to the scope. I now know how to use cycles with its nodes, but I don't get how to the scope crosshairs. The image is a crosshair on a white background. However when I put it into blender, even with the transparency, translucent, or glass BSDF nodes, the white background is still there.

You can use this kind of node setting:

The principle is the following:

Your image is used as diffuse
But it is also used as input to drive the mix shader
This is driven by the white parts here: the more white the more the mix shader will use its second input which is here a glass

Using a glass shader can help to have this kind of zoom like effect, just changing the IOR value of the node:


Low Poly Water Effect How would I achieve this low poly water effect using cycles?

But the closest I've gotten would be this:

It looks to me like some kind of mix between glossy and transparent shaders.

This setup is rather arbitrary, it's up to you to come up with a combo you like.

The trick is that there seems to be multiple layers of mesh superimposed, allowing objects near the surface to be seen, while nearly completely obscuring the bottom.

One way to go about creating such layers is by first creating a "base mesh". I used a fluid simulation, but for more control you may want to use dyntopo.

Once you have a mesh more or less how you'd like it, duplicate it and add differently seeded displace modifiers, and decimate modifiers with different ratios to get a mix of polygon sizes.

Also note the way the water meshes in your example have been sculpted to give the impression of currents; long poly strips where water is flowing straight, and choppier, evenly distributed triangles for more turbulent regions.
I didn't do this, but you may want to.


Force IK rig to bend knee "Wrong" way? I've designed this mech's legs so they can fold up when crouched but that left the knee pivot behind the top one so my IK rig bends my leg the wrong way. Can I have my knee behind the "pelvis" and force the knee to bend forward still?

Thank you!

It turns out I was overthinking this problem. I simply had to bend the knees before I rig it.


Modify size of bevel object at certain points along path I am creating a growing branch that will grow into my daughters name similar to the video tutorial here:
https://www.youtube.com/watch?v=FdEAx3SbFaw

The video tutorial shows how the tapered branch grows.
After it grows, I want it to get fat in some areas, but not all.
I was hoping to control the tapered width at different areas but the tutorial says to use the bevel object as the taper object in order to achieve a animated growing while extruding effect.
Once it grows to the length I want, then I want to change the diameter at different areas.

Currently I can only get a straight taper with the setting set to taper object.

Instead of using the Bevel object, simply set Bevel Depth to a fixed value. You can then use Shape Keys on your taper object - for the 'growing branch' stage you would simply have a gentle curve, starting high and tailing off. Animating the Start and End will allow the branch to 'grow'.

Once it has grown you can then use the shape key to blend to a new taper shape where different sections of the taper curve are higher or lower to vary the thickness at the corresponding point along your curve.

In order to achieve this your Taper curve would need to have enough detail to allow for your final shape. An alternative is to use a Lattice to make the deformations and apply the shape key to the lattice instead of the curve itself.

This is a very rough example (the first time I've attempted this and knocked up in a spare half-hour - so excuse the lack of artistic talent!), but the following can be achieved :

The two lines below the 'Text' are the Taper curve (the top one) and the Lattice used to deform it. A Deform modifier on the taper curve uses the lattice deformation to deform the curve. The Lattice uses a Shape Key to control its deformation.

Blend file included


I cant change to faces or edges view! where are the buttons to select faces or edges view gone? loaded factory settings, still not there.

You don't have a mesh, you have a curve that is filled in (i.e. set to 2D curve type).
Curves have no face / edge / vertex options. If you want to convert it to a mesh (something that has vertices and faces) use Alt + C and select Mesh from Curve.


Blender 2.8 - weathering effects Is there an efficient way to add a weathering effect to an object?  By weathering, I am thinking of an overlaid thin layer of mottled grime on a sign or a car, maybe a little rust here or there.

There are many video-tutorials for this topic on Youtube and (answered) questions here in BSE. To get you started I selected some of them for you:

How to Make Rust

Quickly Add Dirt to Crevices

Using Ambient Occlusion to add Grunge

Need to make (node setup) of realistic dirt/ grime/grunge on top of image texture of ceramic tiles


Find lower left vertex of a quad with python I'm a looking for a simple and fast way to find the lower left vertex index of a quad with python. What I've tried so far is to change the coordonate system to fit with the normal and sort the coordonnate of the vertices to the x and y axes and get the first element. Unfortunately this doesn't seem
to work, any idea of a simple solution ?

I think, this is doing the job:

The principle is the following:

Get objects faces that are quads
For each face, get its normal in world coordinates
Define a left axis from a (0, 0, -1) vector and this normal (cross product)
Get the face's vertices and calculate their center
Compare each "v minus center" in world coordinates to the left axis
From this, take the lower (along z) vertex

Here is the commented code

import bpy
from mathutils import Vector

def SelectLowerLeft( obj, polygon ):
    worldMat = obj.matrix_world
    normalInWorld = worldMat * polygon.normal
    polygonVertices = [obj.data.vertices[vI] for vI in polygon.vertices]

    if abs(normalInWorld[2]) == 1.0: #If normal is along Z, all are lower left... a choice
        for v in polygonVertices: v.select = True
    else:
        #Left axis is defined from down (Z=-1) cross the normal
        leftAxis = Vector( (0, 0, -1) ).cross( normalInWorld )
        #Create pairs of vertex and in world coordinates, sorted by z in world
        verticesAndWorldCo = sorted( [(v, worldMat * v.co) for v in polygonVertices], key=lambda vAndco: vAndco[1][2] )
        #Center of the polygon
        centerInWorld = sum( [co for v, co in verticesAndWorldCo], Vector() ) / len(verticesAndWorldCo)
        #Take the first going left
        for toSelect in [v for v, co in verticesAndWorldCo if (co - centerInWorld).dot( leftAxis ) > 0]:
            toSelect.select = True
            return
print( '-------------' )

obj = bpy.context.object

data = obj.data

prevMode = obj.mode

#Deselect all
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='DESELECT')

#To be able to select via 'select' property
bpy.ops.object.mode_set(mode='OBJECT')

#All object's polygons that are quads
for polygon in [p for p in data.polygons if len(p.vertices) == 4]:
    SelectLowerLeft( obj, polygon )

bpy.ops.object.mode_set(mode=prevMode)


World shaders disapearing in Blender File In shading tab I created two settings for the world. One for a night, one for a day,
but one is always disappearing after I reopen the file.

Is there a way to keep them both? I tried solving it this way:

However settings are suppose to be linked to 21 files. When I change something in the settings I have to append it in 21 files and I'm sick of that.

Blender By default purges most unused data blocks. (this happens when you save and reopen the file)
Just add a fake user and it should remain in the file until it has no user (be it fake or not) and you save it or manually delete it.


Selecting all unassigned vertices? I'm rigging a model, and I'd like to hide all of the vertices I've already assigned to vertex groups. Is there a way I can quickly select either all vertices that are assigned to various vertex groups, or all vertices that have not yet been assigned to a vertex group?

With your object selected, go to the object properties tab, select the vertex group you want to see from the list, and click the "select" button (or deselect, depending on what you want to do). You must be in edit mode to see the selection.


Custom operator that applies transforms to all objects I need to create an operator to apply transforms to all visible object in the scene. This is how I tried to do it.

class ApplyAllOperator(bpy.types.Operator):
   bl_idname = "my.apply_all"
   bl_label = "Apply All Operator"

   def execute(self, context):
         for object in bpy.context.scene.objects:
             if object.is_visible(bpy.context.scene):
                object.select = True
                bpy.context.scene.objects.active = object
                bpy.ops.object.transform_apply(location = True, scale = True, rotation = True)

However I'm getting an error RuntimeError: Operator bpy.ops.object.transform_apply.poll() failed, context is incorrect.

How can I fix this?

Press A to select all and then ⎈ CtrlA->All Transforms - apply transforms already works on all selected objects.

To get your example working, the context calling the operator needs to be from the 3dviewport, so it will fail if you are running the script in the text editor. Don't call the operator from your script, register the class and then search for it in the 3d view.

If you still have an issue, you can override the context. You can find several questions here to explain ways to do that.


Array modifier - spiral I'm trying to create a spiral array but It always becomes a circle.
i.e. I want to place Domino tiles on a path that looks like this Top view:

                  __,aaPPPPPPPPaa,__
          ,adP"""'          `""Yb,_
       ,adP'                     `"Yb,
     ,dP'     ,aadPP"""""YYba,_     `"Y,
    ,P'    ,aP"'            `""Ya,     "Y,
   ,P'    aP'     _________     `"Ya    `Yb,
  ,P'    d"    ,adP""""""""Yba,    `Y,    "Y,
 ,d'   ,d'   ,dP"            `Yb,   `Y,    `Y,
 d'   ,d'   ,d'    ,dP""Yb,    `Y,   `Y,    `b
 8    d'    d'   ,d"      "b,   `Y,   `8,    Y,
 8    8     8    d'    _   `Y,   `8    `8    `b
 8    8     8    8     8    `8    8     8     8
 8    Y,    Y,   `b, ,aP     P    8    ,P     8
 I,   `Y,   `Ya    """"     d'   ,P    d"    ,P
 `Y,   `8,    `Ya         ,8"   ,P'   ,P'    d'
  `Y,   `Ya,    `Ya,,__,,d"'   ,P'   ,P"    ,P
   `Y,    `Ya,     `""""'     ,P'   ,d"    ,P'
    `Yb,    `"Ya,_          ,d"    ,P'    ,P'
      `Yb,      ""YbaaaaaadP"     ,P'    ,P'
        `Yba,                   ,d'    ,dP'
           `"Yba,__       __,adP"     dP"
               `"""""""""""""'

But it always becomes some kind of circle,

How can I set increments to the radius?

How can I place Domino tiles in a spiral manner?

Is there any fast way other than placing them one by one?

Unless, for some reason, you need your dominoes to be an array, one approach, as mentioned, is to start with an Archimedean spiral curve, and use dupliframes. A curve deform modifier will deform your dominoes.

In User Preferences (CtrlAltU) > Add-ons,  enable Add Curve: Extra Objects.

Create and adjust an Archimedean spiral, as a NURBS curve.

Arrange your domino so its origin is at the point you would like the lie on the curve, and, for convenience, so that its 'forward' face looks down global Y.

In the curve's properties, 'Data' tab, check 'Path Animation' and inside that panel, 'Follow'.

Select the domino, then the curve, setting the curve to be the domino's parent. (CtrlP)

In the domino's Properties, 'Object' tab >  'Duplication', select 'Frames', setting 'Start' and 'End' to adjust the region of the spiral over which the domino is to be duplicated. Uncheck 'Speed'

The frequency of dominoes on the curve can be adjusted by the total number of frames in the curve's Path Animation.
Other tweaks available, as per manual.

To convert the duplicate dominoes into linked instances: select the dupli-domino, ShiftCtrlA .. (Make Duplicates Real).
To unlink the object data, and make independent meshes: select the instances, hit U .. (Make Single User). From the Toolbar, check the options 'Object' and 'Object Data'.
UPDATE for Blender 2.8:
Now 'DupliFrames' have gone, another approach is to create a carrier for your duplicate object, whose distortion you don't care about.

Create the spiral curve as before
Create a small plane, same origin, say, up in Z
Assign the plane an Array modifier, constant offset, count set to 'Fit Curve', targeted on the spiral.
Also give the plane a Curve modifier, targeted on the spiral, deformation direction Z.

(left, illustrated)

Now you can create a domino. Its Z will face down the plane's normal..
.. when you parent the domino to the plane, and in the plane's Properties > Object tab > Instancing panel, set 'Faces'.

If, for example, you wanted variations in transform, or a variety of objects on the spiral, you could use the modified plane as a Particle emitter, one per face, instead.
Edit: (response to comment from @Ron Jensen) To make the domino duplis into a real object, to use as a Boolean Cutter..

Arrayed Plane selected, CtrlA > 'Make Instances Real'

CtrlJ Join selected instances of the domino into a new object, and use as a cutter.

I haven't found a way of cutting with a collection instance, which would have been nice, to save data?


How can i get the weight for all vertices in a vertex group? I have created this function to get the weights from a group:

def get_weights(ob, vgroup):
    weights = []
    for index, vert in enumerate(ob.data.vertices):
        for group in vert.groups:
            if group.group == vgroup.index:
                weights.append([index, group.weight])
    return weights

Is there any better more efficient way to do this?

For The RNA mesh API, your example is quite good, one minor change you can make is to break once the group index is found.

Instead of making a large list, you could use a generator function, this can save memory for the cases you can iterate over the elements, and be converted to a list or tuple if you need, it has the same worst-case time, but in practice will often save some looping.

import bpy
obj = bpy.context.object

def get_weights(ob, vgroup):
    group_index = vgroup.index
    for i, v in enumerate(ob.data.vertices):
        for g in v.groups:
            if g.group == group_index:
                yield (i, g.weight)
                break

import bpy
obj = bpy.context.object
vgroup = obj.vertex_groups[0]

# iterate over index, weights
for i, w in get_weights(obj, vgroup):
    print(i, w)

# if you need as a list...
weights = list(get_weights(obj, vgroup))
print(weights)

Note, in some similar cases to this, you can use list-comprehension, however having to check the vertex is in the group causes the checks within the list-comprehension to become quite convoluted, so best avoid in this case.


I can't see my spotlight in the final render, I'm new to this, btw Basically I'm starting out in Blender, doing some bouncing ball in 2D and a moving 3D cube, nothing fancy. In the final render I can't figure out why in the world I can't see the light source, could it be because of my hardware? (Macbook pro mid 2014, 2,5 GHz Intel Core i7, 16gb ram, NVIDIA GeForce GT 750M 2 GB Intel Iris Pro 1536 MB). I've tried for render engines Eevee, cycles and workbench, but none appear to work, although an object with emission is visible. I'll post some pictures of blender and the renders.
.

you made nearly everything right, just change the render engine to Cycles and then you get:

and by the way: i rendered it on a macbook too...so it just works ;)


How to save addon preferences? How to prevent addon preferences from getting reset? Each time I disable an addon, preferences gets reverted back to default.

I believe you may have a deactivated auto-save option.

In the Blender Preferences bottom left side you have the options, opening these you should see that yours are not hooked on the "Auto-Save Preferences". Hook that option and click "Save Preferences" or make some changes afterwards to trigger the auto-save function.

Should this not be the solution, and it's add-on specific, then i believe that the add-on might not be able to save it's preferences when it get's deactivated.
This could be depending on the code of the add-on, or if that is the case with all add-ons be Blender code related.
In any case, could you please add some examples as to allow trying to replicate the problem.


Is it possible to apply a texture so that it looks like it is actually ON the mesh and not PROJECTED on? So I'm working on a sci-fi piece and I have an object/mesh called "shell" which has two sides. The inside is to be textured with a wireframe texture so it looks like there is a protective mesh lining the inside of the shell.

My issue is as you see in the images. The way it unwraps the mesh the texture simply looks projected on from a particular angle instead of actually curving and following the contour of the object (as if it were really lining the surface).

Is there an unwrapping technique I am missing?

I've tried placing seams, etc, nothing looks good.

I've included two screenshots for reference.

Thanks in advance!

I guess you need a Hight Map node in your shader, I've seen people use the same image as both the hightmap and the texture itself, but they say it will not always work correctly.

You should and connect it to the displacement entry of the output, study a little about how to make height map images to use alongside the texture maybe.


How to align the material with the mesh I have rotate the uv as well in the mapping.

I want to have a straight line following the arrow shape

Any extra node or how can i rotate to fix. Any suggestion. Thanks

Unfortunately the rim of a Solidified mesh doesn't exist in time to be UV mapped. It has no UV map at all; any texture can only be projected through the solid from the faces that are UV mapped before solidifying, which gives no opportunity to change the colour on the way through.
You have some options:

Apply the Solidify modifier, and UV unwrap the whole arrow, with its (now real) rim.
Solidify the other way, so the wide sides are now the Solidify-created rim. Then you could UV map the thin sides of the rectangular profile, before solidifying.
Create a copy of the arrow after solidifying, but before any other modifier, unwrap the copy, and use a Data Transfer modifier to pick up the UV's from the copy, on the way down the original arrow's stack.

That's the option that's illustrated here (the copy is not rendered):

It would all depend on how non-destructive you need to be.. which modifiers you might need to leave yourself free to adjust.


How to create a GUI based window in Blender Game Engine that displays text? How to create a GUI based window in Blender Game Engine that displays text? So I was going to create a NPC chatting menu in my RPG based game, using only logic bricks. I found this to be difficuly because what I wanted to have happen is when the player is talking to the NPC, a window within the game pops-up and Displays what the NPC is saying.

You can try to follow some Tutorials like for a HUD, a Health Bar or maybe some Word Wrapping of a text overlay...


Multiple objects or multiple meshes per object I don't think this particular question has been asked / answered as I have been unable to find it.

After following both the beginner and intermediate tutorials from BlenderGuru, I decided I'd try a few things of my own. And I'm having a lot of fun failing and learning from those failures to try again and encounter a new problem.

The thing I have been wondering however, what is the better practice; Keep 1 object with multiple meshes, or multiple objects each with a mesh? So, for example, I made something like a spaceship. Do I keep the hull of the ship one object and create another object for the cockpit windows? Or do I create a new mesh within one object and try to work with that and then intersect them?

I am just modelling for fun, I am not going to export it to a game or whatever. Just want to see where this goes.

There is no definitive answer for this, it is mostly a matter of opinion with some consideration of making some steps easier and how blender performs.

While you are modeling a complex model, there are advantages to working with multiple objects :-

You can make linked duplicates of an object so that they all use the same mesh data, this lets you model one window and duplicate it, then changing one window changes all windows to match.
Modifiers can be used to create a piece of a larger model, this might only be a temporary object that can be combined once the modifiers are applied.
You can quickly go into local view of just the selected objects (press / on the numpad) so that everything else is hidden.
You can find objects by name (if you name them as you go) and hide multiple objects to make working on one part of your model easier. While you can hide parts of a single mesh, you need to manually select each part of the mesh to hide or select what you want to see and invert the selection and hide it.

When a model is complete, having 135 separate objects to represent a single spaceship can make it awkward to select and move around as one, so there is an advantage to combining the multiple objects into one, once the modeling is complete. This is quickly done by selecting them and pressing ⎈ CtrlJ.

Performance wise using larger scenes, blender will perform better with one object that has one million vertices than with 1000 objects that have 1000 vertices each. This answer might give more insight.


how to make a seprated part of a object Okay, so I have this

and I can cut it so when I 3d print it I can take off the head and have something in side of it like an Arduino Uno and other stuff

Go to Edit mode.

Select the vertices or faces of the part you want to separate and press 'P'.

This opens the 'Separate' menu, where you can choose 'Selection'.

That's all. Now you will have that part as a separate object.


how to get a mask that only contains the inside of a bowl I am trying to texture a bowl (procedurally) and I want a part of a texture to only work on the inside walls of the bowl and vise versa I tried using the back facing option in the geometry node but that seems to work in opposite directions of the normals (I think) whereas in this bowl I want the texture to be on the same side of the surface just not on the outside walls of the mesh.
basically, I want the circular white color only on the inside walls and not on the outside.

True normal channel
Given a similar face distribution, you can spot a difference between the normal of the faces on the concave side and the ones on the convex side.

Just sort them with a math node:

And exclude the ones who are pointing straight up if you want to get rid of the border.

Obiuvsly this trick works only for a simple vase like the one you posted, for any other model I would use vertex paint:


Smoothing a baked f-curve I have an f-curve baked from an audio file, but finding it too jittery for my usage:

It there a way to smooth the baked curve? I've looked through the modifiers, expecting to find a filter, but there doesn't seem to be one.

First, you can un-bake them:
(Install this as an add-on)

#########################################
# resamples baked f-curves to a new     #
# action + f-curve or a 3d bezier curve #
#########################################

bl_info = {
    "name": "unbake f-curve",
    "author": "liero",
    "version": (0, 4),
    "blender": (2, 6, 0),
    "location": "View3D > Properties Panel",
    "description": "Resample baked f-curve to a new Action / f-curve",
    "category": "Animation"}

import bpy

bpy.types.WindowManager.RGB = bpy.props.BoolProperty(name='Use RGB colors', default=True, description='Use RGB colors for f-curves')
bpy.types.WindowManager.scaleX = bpy.props.FloatProperty(name='X scale', min=.01, max=5, default=.1, description='X scale for 3d curve')
bpy.types.WindowManager.scaleY = bpy.props.FloatProperty(name='Y scale', min=.001, max=5, default=1, description='Z scale for 3d curve')
bpy.types.WindowManager.use_radius = bpy.props.BoolProperty(name='Use Radius', default=False, description='Use Radius / Height to visualize')

class Boton(bpy.types.Panel):
    bl_label = 'unBake selected fcurves'
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'

    def draw(self, context):
        wm = context.window_manager
        layout = self.layout
        box = layout.box()
        box.operator('curve.unbake_action')
        box.prop(wm, "RGB")
        box = layout.box()
        box.operator('curve.unbake_bezier')
        column = box.column(align=True)
        column.prop(wm, 'scaleX')
        column.prop(wm, 'scaleY')
        box.prop(wm, 'use_radius')

class UnBakeA(bpy.types.Operator):
    bl_idname = 'curve.unbake_action'
    bl_label = 'unBake to Action'
    bl_description = 'Resample baked f-curve to a new Action / f-curve'
    bl_options = {'REGISTER', 'UNDO'}

    @classmethod
    def poll(cls, context):
        return (context.object and context.object.animation_data)

    def execute(self, context):
        obj = bpy.context.object
        wm = bpy.context.window_manager
        pts = [(c.sampled_points, c.data_path, c.array_index) for c in obj.animation_data.action.fcurves if c.sampled_points and c.select]
        if pts:
            keys = bpy.data.actions.new(name='KEYS')
            for sam, dat, ind in pts:
                fcu = keys.fcurves.new(data_path=dat, index=ind)
                if wm.RGB: fcu.color_mode = 'AUTO_RGB'
                fcu.keyframe_points.add(len(sam))
                for i in range(len(sam)):
                    w = fcu.keyframe_points[i]
                    w.co = w.handle_left = w.handle_right = sam[i].co
            obj.animation_data.action = keys
        return{'FINISHED'}

class UnBakeB(bpy.types.Operator):
    bl_idname = 'curve.unbake_bezier'
    bl_label = 'unBake to 3D'
    bl_description = 'Resample baked f-curve to a 3d Bezier curve'
    bl_options = {'REGISTER', 'UNDO'}

    @classmethod
    def poll(cls, context):
        return (context.object and context.object.animation_data)

    def execute(self, context):
        obj = bpy.context.object
        wm = bpy.context.window_manager
        for c in obj.animation_data.action.fcurves:
            if c.sampled_points and c.select:
                sam = c.sampled_points
                cu = bpy.data.curves.new('path','CURVE')
                cu.dimensions = '3D'
                if wm.use_radius:
                    cu.fill_mode = 'FULL'
                    cu.bevel_resolution = 6
                    cu.resolution_u = 1
                    cu.bevel_depth = 1
                spline = cu.splines.new('BEZIER')
                spline.bezier_points.add(len(sam)-1)
                curva = bpy.data.objects.new('curve',cu)
                bpy.context.scene.objects.link(curva)
                for i in range(len(sam)):
                    w = spline.bezier_points[i]
                    y = wm.scaleY*sam[i].co[1]
                    if wm.use_radius:
                        w.radius = y
                        y = 0
                    coords = (wm.scaleX*sam[i].co[0],y,0)
                    w.co = w.handle_left = w.handle_right = coords

        return{'FINISHED'}

def register():
    bpy.utils.register_class(Boton)
    bpy.utils.register_class(UnBakeA)
    bpy.utils.register_class(UnBakeB)

def unregister():
    bpy.utils.unregister_class(Boton)
    bpy.utils.unregister_class(UnBakeA)
    bpy.utils.unregister_class(UnBakeB)

if __name__ == '__main__':
    register()

Script by liero (http://blenderartists.org/forum/showthread.php?221387-resample-baked-f-curve)

Select them all and hit Alt - 0. You may need to use it multiple times to get the desired effect. This is non-procedural, and any change you make are not easily undone (You have to use Undo).

Finally, if you wan't to, you can re-bake them.


Select normals pointing in a certain direction A collegue has modelled, in Rhino, a small transparent plastic bottle (the type commonly seen holding small amounts of cosmetics etc.) with an embossed logo on the wall of the bottle.

The mesh is pretty evenly divided until it gets to the embossed logo where the mesh gets very, very dense due to the bevels. It's imported into Blender as an .obj file.

For the most part, the normals all face out as should be the case, but around the embossed area the normal direction becomes random - some face out, others face into the bottle mesh making glass rendering impossible.

I've tried just about all the normal management functions (there aren't many) but it literally comes down to me having to individually select the reversed faces and and then flipping the normals. This is not a practical solution.

I'm wondering if anyone might be able to write a script for me, that would work something like this: 1) Import my mesh, set its base at 0:0:0. 2) Place an empty at the bottle's centre of mass, so-to-speak. 3) Run script, in Edit Mode, that selects all the normals on the bottle mesh that point towards the empty's z-axis.

Surely then I could simply click on flip direction and solve this issue?

Feedback is welcome!

Thanks
Jacques

In most cases Make Normals Consistent (Ctrl+N) operator should help, see  Why are some faces in my mesh darker?. With all selected run it and it should make all normals pointing the right direction.

However there are some cases when this won't work, i.e. it will consistently flip normals instead of making them pointing one direction. Probably there isn't yet solution exactly for every case like that, still you can use Non Contiguous option of Select Non-Manifold operator:

  Non Contiguous
      Selects edges that belong to exactly 2 faces with opposite normals.

link to manual

Execute it in Vertex or Edge Selection mode; it will select all edges which form problem faces, however depending on complexity of model selection won't form faces which you'd like to recalculate. You may want to run operator several times to feed all the faces to operator.


Radiant Rig XL does not work with my character mesh because there is a script that interferes with it I'm trying to make work the add-on called "Radiant Rig XL" with the character that I usually use to learn blender. I don't why,but it does not work,like you can see from this screenshot.

and you can find the character that I'm working with here.

I sent an email to the author of the script and he replied to me telling :

  "You have a script attached which interferes with Rigify (rig_ui.py). Radiant Rig depends upon Rigify as stated in the instructions.
  If you are changing Rigify, I can't predict what will happen"

I disabled the option called "auto run python scripts" from the user preferences panel because I wanted to disable the "rig_ui.py" script,but it didn't work. Can someone of you be more specific ? How can I disable the interfering script ? What is this ? I don't know anything about it. Thanks.

Here were the steps I took to diagnose the problem you are having:

1) When I opened your file, I saw the error message "Auto-run disabled: Text 'rig_ui.py'" (see screen shot 1)

2) Near the Help item at the top, I switched the layout from 'gp2' to 'Scripting' (see screen shot 2)

3) I saw a script which is designed to modify the rigify plugin. Radiant Rig depends upon Rigify as stated in the instructions. If you are changing Rigify, I can't predict what will happen. I did not have time in the morning to debug the rig_ui.py attached to your file. (see screen shot 3)

4) I selected the figure in your file and merged all the parts into one object (CTRL+J)

5) I exported your object.

6) I created a blank blender file; I was able to import the exported figure into this new file.

7) I ran my script and it fitted the mesh better.

Please follow those exact steps.


IK-rig doesn't bend when I add elbow-target/elbow-pole I have an IK-rig set up for my arm. An upper arm bone, a lower arm bone and the arm-IK bone, like so(front-view):

The IK-rig works until I add an elbow target/elbow pole. At this point, the arm stops bending.

It goes from bending beautifully like this(top-view):

To not bending, no matter where the IK-bone is placed(top-view):

How do I make the arm bend when I have an elbow-target/elbow-pole?

Seems like what's needed is a tiny bend in the armature, in edit mode. In other words, Blender needs to know where your elbow is bending towards. Go into edit mode, move the connection between the upper arm and lower arm just a little bit towards the elbow target/elbow pole. Then you should be good to go.


Bounding box as mesh? Is there a way to make a mesh cube match the size of another object's bounding box, and have it updates as that size changes?

One way to do it if your bounding box fits the object's dimensions:

1.) Select the Mesh Cube and then add the other object to the selection

2.) Copy the Dimensions and rotation info to the Cube

3.) Add Child Of constraint to Cube and select the object as the parent

4.) It will go wonky, so press the Set Inverse button in the constraint

5.) Finally, Restrict Selection so that it can't accidentally be manipulated


Simple Addon 50 lines - Crash blender - what I do bad? I start to learn Python and Blender. But can't figure out what I do bad here.
The code is :

bl_info = {
    "name" : "HELLO WORLD",
    "author" : "Author",
    "blender" : (2, 80, 0), "version" : (0, 0, 1),
}

import bpy

class LODP_CM_OT_set_cam ( bpy.types.Operator ) :
    bl_idname       = "lodp_cm.set_cam"
    bl_label        = "Set camera brush"

    def execute( self : bpy.types.Operator , context : bpy.types.Context ) :
        obj  = bpy.context.active_object

        bpy.context.view_layer.objects.active = None
        bpy.context.view_layer.objects.active = obj

        mod : bpy.types.DynamicPaintModifier = obj.modifiers.new( "Dynamic Paint", "DYNAMIC_PAINT" )
        mod.ui_type = "BRUSH"

        # CRITICAL ERROR -  EXCEPTION_ACCESS_VIOLATION - 0x00007FF73793DDB0
        bpy.ops.dpaint.type_toggle( type="BRUSH" )
        # CRITICAL ERROR -  EXCEPTION_ACCESS_VIOLATION - 0x00007FF73793DDB0

        return {"FINISHED"}
# end class LODP_CM_OT_set_cam

class LODP_CM_PT_main ( bpy.types.Panel ) :
    bl_label        = "HELLO WORLD PANEL"
    bl_idname       = "LODP_PT_main"
    bl_space_type   = 'PROPERTIES'
    bl_region_type  = 'WINDOW'
    bl_context      = "scene"

    def draw(self, context):
        layout = self.layout
        layout.operator( LODP_CM_OT_set_cam.bl_idname )
#

classes = [ LODP_CM_OT_set_cam, LODP_CM_PT_main, ]

def register():
    global classes
    for klass in classes : bpy.utils.register_class( klass )
#
def unregister():
    global classes
    for klass in classes : bpy.utils.unregister_class( klass )
    classes.clear()
#
if not __package__ : register()

representative gif :

After trying to get the code of the error or something,
get : EXCEPTION_ACCESS_VIOLATION - 0x00007FF73793DDB0, exit code 11
Is a mistake, bug, bad syntaxis, another thing? , but since I'm a newcomer, I have my doubts.

Is it as simple as it could be?.
A TL;DR comment turned into answer:
Doesn't crash for me... but does throw errors. Some of the issues as I see them.
Sure it's a simple little addon, but.. appears to be some added and IMO unnecessary complexity added too. (bling).
Is there really any need to type hint the usual suspects  and  familiar arguments of  self, context ?
def execute( self : bpy.types.Operator , context : bpy.types.Context )

Let's look at  Text Editor > Templates > Python > Operator Simple and make a small change
def execute(self, context):
    print(type(self))
    main(context)
    return {'FINISHED'}

output
<class '__main__.SimpleOperator'>
<bpy_struct, Object("Armature") at 0x7f1e0c715008>

ie the operator type is not an instance of  bpy.types.Operator
Any need to toggle the active object?
There is no need to toggle the active object with
context.view_layer.objects.active = None
context.view_layer.objects.active = obj

and  since context is an argument of method there is never any need to see bpy.context
Dynamic Paint Modifier.
Once a dynamic paint modifier is added to an object, it cannot be added again.  If you try and do so again it will not add a modifier and return None. (NoneType) is not an instance of bpy.types.DynamicPaintModifier
Main thread.
Any benefit in using if not __package__ vs if __name__ == "__main__" ?  Will it always equate?


How to add reference photos in orthographic view from angles other than the default front, back, top, etc.? 3D modeling is easier with reference pictures, which can sometimes be hard to find facing straight forward, left, right, top, etc. If I could add other angles for pictures it would be great.
Thank you.

There are two ways (as far as I know)

Add a plane with the texture.
Set the background to the Camera.

1. Add a plane with the texture

This is a way used in a 3D software called MODO.
It is easy to manage the location, rotation and scale.
However it is tedeous and cannot be used in Solid (in matters of viewpoint shading.

There are some tips that can help you with this method.

select "Generate UVs" (on the toolshelf when you made the object)
press the E key (it will resize the uv so that the ratio matches the actual mesh)

2. Set the background to the Camera

Find for "Camera" in the "Axis" of the Background image panel.
This will fix the image as a background image of the camera.

There are some tips that can help you with this method.

lock the location and rotation at the Properties Region
switch between cameras with Ctrl-Numpad0


Snap to mesh issues with Z and X axis constraints I have two meshes that I've joined to a single object.  I'm attempting to use the snap to mesh feature for each of the 6 vertices on the face of mesh 1 to snap them to different faces/edges on mesh 2.

I select the vertex I want to move, press Y to constrain movement to only the Y-axis, and then it slides smoothly along the Y, not snapping to the face.  Is this behavior intentional?  Is there a better way to do what I'm doing while maintaining precision?

I'm using Blender 2.6.

There is another way to solve this (that may work), using the shrinkwrap modifier. Do this before joining the objects.

Create a vertex group with the vertices you want to snap.
Add a shrinkwrap modifier.
Set your vertex group as the one affected.
Set mode to "Project".
Select the axis to project along.
Tick both positive and negative (maybe you need to do this).

Like this:


Can someone fix this problem with cloth physics? I am trying to re-create this scene from a youtube tutorial. There are two cubes in the scene (the bed and mattress). The cloth is supposed to fall on the mattress but it falls through it on the second cube (the bed). Can someone explain what I am doing wrong? The file can be accessed at this link (https://gofile.io/?c=1j2Icj)
Also, the cloth also acts strange when I run the animation.
I'd appreciate if someone can help me resolve the issue.

The problem is probably that you did not set the second cube to "Collision". You can do this by going to the Physics tab and selecting Collision. You can continue by playing with the collision settings and seeing what works for you.


How to have multiple same editor panels (eg. two user preference window) with different states? I want to have two user preference windows so that I can quickly search for short cuts In one of them, and change themes or other settings in another one.

The problem is, all user preference panels share same states, if you change the active tab in one of them, any other same panels will change accordingly, which is unnecessary.

Any way to avoid this?

Essentially the goal is to make SpaceUserPref behave like SpaceText. You can have multiple text editors in the blender, while every instance has different list of texts.

keyword : active_section

Steps:
Replicate the following sRNA fragment from makesrna/rna_userdef.c to rna_space.c :

    prop = RNA_def_property(srna, "active_section", PROP_ENUM, PROP_NONE);
    RNA_def_property_enum_sdna(prop, NULL, "userpref");
    RNA_def_property_enum_items(prop, user_pref_sections);
    RNA_def_property_ui_text(prop, "Active Section",
                             "Active section of the user preferences shown in the user interface");
    //RNA_def_property_update(prop, 0, "rna_userdef_update");

Then reverse transcript it into makesdna/DNA_Space_types.h:

/* User Preferences View */
typedef struct SpaceUserPref {
    short userpref; //new field
    short padpad;
    ……
} SpaceUserPref;

as field short userpref. Refer to the original UserDef structure.

By above two steps, we have replicated active_section property for the python type SpaceUserPreferences.

On the python side, by using this property instead of UserPreferences.active_section, the beheaviour of tab selection is now independent for each instances :

space_userpref.py

class USERPREF_PT_tabs(Panel):
    ……
    def draw(self, context):
        st = context.space_data
        if not hasattr(st, 'active_section'):
            st = context.user_preferences

        self.layout.row().prop(st, "active_section", expand=True)

def getContextualSection(context):
    st = context.space_data
    if not hasattr(st, 'active_section'):
        st = context.user_preferences
    return st.active_section

# edit poll method for every tab:
    @classmethod
    def poll(cls, context):
        userpref = context.user_preferences
        return (getContextualSection(context) == 'INTERFACE')

docs:
bpy.types.SpaceUserPreferences
bpy.types.UserPreferences


Why does Photoshop read my exported Blender 16bit file as 32bit? I am just curious why when I export a 16bit image from Blender and open it in Photoshop it is read as a 32bit file and not 16bit?

Am I exporting from Blender incorrectly?

Because 16bit EXRs are floating point, but Photoshop's 16bit format is integer.

Integers represent simple whole numbers, in the case of int16, pixels are values from 0-65535. Floating point uses a special representation, sort of like scientific notation. It's still 16bits per channel though. Floats are less precise than integers, but allow a wider range of values. This is often useful for visual data, since our eyes have a very wide dynamic range but are not terribly precise.

The problem Photoshop is trying to deal with is the lack of dynamic range. 16bit integer (int16 for short) has 2^16 values, so it has 16 stops of dynamic range. 16bit floating point (float16 for short) is able to pack 30 stops into the same 16bits by using its scientific-notation-like way of writing the values. In order to avoid smushing that dynamic range, Photoshop needs to import it in 32bit mode.

On a further note, I would advise against importing OpenEXR files into Photoshop. In most cases, it's best convert to a display-referred format first (like 16bit TIFF or PNG, which is integer btw) which better accommodates Photoshop's editing model. See this question for related info: Render with a wider dynamic range in cycles to produce photorealistic looking images

Additionally, Photoshop is not equipped to handle data within OpenEXR such as additional passes, z-buffers, etc. As you can see from it's confusing switch to 32bit (due to lack of float16 support), Photoshop is simply not designed around the sort of data stored in an OpenEXR. "Pre-chewing" the data using Blender's compositor or another scene-referred comp tool (such as Fusion or Nuke) will make life a lot easier.


How can I make a pill shape? (capsule) Is there any easy way to make a basic shape that looks something like this?

Yes, you can do it in a few steps:

(updated as per PG math's advice)

Add a sphere Shift-A>Mesh>Sphere
Enter edit mode Tab
Set the shading to smooth
Grab one end, including the middle loop (use Numpad 3 to go into side view and Z to be able to select vertices on the other side. Then hit B for box select to get everything except the middle loop.)
extrude it up using E.

Result:

Bonus:

How to add the ridge:

Use Alt-RMB to select the desired loop, you'll have to do this twice, once for each side.
Deselect the vertices at the ends of the pill
Use Ctrl-B to bevel the edges, make it a very very small bevel
in the F6 menu, set the number of cuts to 3.
Select the middle cut and scale it out a bit, use Alt-S
Add loop cuts to the edges loops around the edge to help keep the smooth shading correct.


Edge loop select does not work! I have a problem i cant select edge loops. I have already reinstalled Blender and restored factory settings.  Alt+RMB and Select->Edge Loops dont work. Any idea why?(i am running it on Win10)

Can't select Edge loop (Alt + RMB is failing )

Try to turn off "Emulate 3 Button Mouse"

You can find it at:

-> File

-> User Preferences(Ctrl + Alt + U)

-> Input

-> Mouse: Emulate 3 Button Mouse(OFF)

-> Press "Save user Settings"


Object Stack Collapse It makes a lot of sense to keep copied (arrayed or mirrored) objects around without collapsing the modifier stack for as long as possible. It allows you to make subtle changes to the root objects and have it influence all of the copies.

Preferably, I would rather never collapse the modifier stack. And it seems like I'm close to pulling this off, except for two big issues..

1. UV editing - Is it possible to layout UVs for a larger object when it consists of multiple element objects that are mirrored or array duplicated? I'm wanting each copy to have its own surface area.

The UV "offset" values within the Mirror/Array modifiers work great, but its difficult to group multiple objects using array modifiers into a single UV map area without collapsing their modifiers. How do you guys deal with this? Is there some way (similar to Max) to add additional modifiers to manipulate UVs on top of the array modifiers? Or is there a way to preview these modifier end results inside the UV editor?

2. Combining into Larger Objects and/or Exporting - Within my game resources, I would prefer many small objects be collapsed down into their single respective larger objects. In order to leave the array modifier active on smaller components, I cannot combine them into their larger objects. So to avoid collapsing the modifiers, I have to leave all of these smaller objects separated. This means I have to join all of them together before exporting, which can become quite a task. Is there an easy way to get this to happen?

Something that seems like it would be useful would be a plugin that automatically combines associated objects, based on a name suffix or through some type of static mesh parenting. Either right before export, or through some single command execution that can be undone in one go.

Anyone else facing these problems and found solutions?

Thanks!

I found something helpful to deal with the modifier stack issue when dealing with UVs (issue #1). Inside of the UV editor, under the [N] key panel, within the "View" tab, under "Overlays", there is a checkbox called "Modified" which shows the end result of modifiers.

So if you use the "offset" features of the array and mirror modifiers, the duplicated geometry will show up in the UV editor as faded gray lines. Extremely helpful!

Seems like this box should be checked by default.

So the thing I'm most concerned with is dealing with multiple sub-objects of simple larger objects. When those sub-objects have modifiers applied to them. It would be great to have some way to combine these together automatically or quickly for exporting.


Color correction in the compositor from the video editor How can I connect clips from the timeline in the video editor to the compositor to add some nodes-color correction, rgb curves etc., to every single clip, or to all of them at once?

If you are already working on the video editor and just want to do color correction, then you can do it with an Adjustment Layer:

Press Shift + A and add Effect Strip > Adjustment Layer.
Press N to bring the Properties panel, scroll to down to the Modifiers and from the Add Strip Modifier drop down menu, you can select whatever you want this strip to do: color balance, curves, etc.

It will affect the strips below, meaning it can affect several strips (several footage clips) at the same time.


Does gltf only support the export of one strip per NLA track? This blend file contains only the default cube. I've create two Actions:
MyTrans that implements only a translation &
MyRot that implements only a rotation.
Each of those Actions, I've 'pushed down' to create an NLA strip on NLA tracks called MyTranT and MyRotT.

So far, so good. If I export the cube to a gltf 2.0 file, and then load the exported file in a viewer, I can see the two tracks, identified by trackname  & play either one, or both at once.
The problem occurs when I restructure what's in the NLA editor a bit. Here, I've added a copy of the rotation action to the MyTranT track.

I can play either track within the Blender IDE. In particular, playing the MyTranT track results in a translation followed by a rotation.
However, if I now export as gltf, only the single action track seems to get exported.
I'm using 2 online gltf viewers:
https://gltf-viewer.donmccurdy.com/
https://sandbox.babylonjs.com/
both behave the same way in this regard.
Both actions have users, MyTrans has 2 and MyRot has 3. Neither action is lost when the blend file is closed & reopened. I've also tried giving each action a fake user.

makes no difference though, the track containing 2 actions doesn't seem to get exported.
For both these situations, I've tried exporting as glTF Embedded and examining the text output.
In the first situation, where there is only a single action in each NLA track, the only names visible in the text output are those of the tracks, ie MyTranT and MyRotT. The action names appear nowhere.
In the second situation, where one track contains 2 actions, it's a bit mixed up. For the track containing a single action, ie MyRotT containing action MyRot, the name 'MyRot' is visible in the output. For the track containing 2 actions, ie MyTranT, the name of the first action on that track, ie 'MyTrans' is visible in the output but the track name is not.
So my question is, why doesn't this work?
Blender 2.83.3 on Linux

The exporter can only use a single strip per NLA track — the limitation is tracked in github.com/KhronosGroup/glTF-Blender-IO/issues/763.


Identifying the source of unexpected lighting differences I am seeking out ideas for why the darkened areasof this .gltf behave so differently with lighting than the other surfaces. Specifically the lower molars, and the tongue facing surfaces of the lower incisors.
I have attempted substituting the materials of each tooth (they each use a different one with seemingly identical properties) and it has no effect. I have attempted transposing the various elements around incase it is a shadow or a lighting issue and it has no effect. This is my first blender project and I am at quite a loss.
What is most perplexing of all to me is that the tongue facing surfaces of the canines do not exhibit this behavior.
For this file, I would like each tooth surface to render with identical lighting; this model is being used to exhibit research results on the spatial positioning of childhood tooth decay, by updating the texture and material of the teeth accordingly.
Thank you so much for your assistance.
the file itself can be found here if it would aid your investigation,
https://drive.google.com/file/d/1DCN1bfNcfQFS2YS195rX1iaaQRdxRrIb/view?usp=sharing

Many of the objects have custom split normals data that need to be removed. This is fairly common with objects imported from other software, and is good to check when running into any shading issues with imported objects that aren't simply resolved.
To fix, simply go to Object Data>Geometry Data>Clear Custom Split Normals for each problem object. To speed up the process, you could use ⇧ Shift + R after selecting the next tooth to repeat the last operator. See the gif below for an example:


Joining faces in a model I recently started dabbling into 3d printing. I extracted a model from a old game, but I noticed that the faces of the model are not 'glued' to each other, they are basically standalone faces near other faces to make the model, how can I make the model a solid or how to join 2 faces to do it to the whole model manually?

Select all vertices, right click and then select merge, merge by distance, which should do just as you want.

Hope this helped!


How do I "show" my UV Map after loading a new image? I've had this happen to me several times. I'm using the UV Map tech perfectly fine. Then I need to load another image. I load the new image, and now my UV Map overlay disappears and the new image is in its place with no mesh.

I've looked all over the web, and I can't find the command to go back to the mesh overlay of my UV Map within the UV Map window.

Help!

I'm adding this to show the gif below. This should not happen, imho. You enter the mesh edit mode, and in the UV/image editor, you see the uvmap and the current mapped image. Then, you simply select another image.


Cycles not rendering image or movie clip used as background in the viewport First time I've used cycles rendering engine.  I'm using a movie clip as the background in short animation. Selected RBGA under Property Tab, and Transparent under Film Tab.  It looks good and individual frames in OpenGL active viewport render, and looks fine.

When I try to get it to spit out PNG files of the finished animation the objects render out fine, except no movie clip background as Blender Render engine did when using Paper Sky setting.  Operator error, or am I trying to do something Cycles won't do?  Haven't found an answer in my searches so far.  Can anyone point me in the right direction please.

Addition:  I think I found my problem after a couple more hours of research.  Post should read "operator ignorance" instead of operator error.  Too tired to try the solution tonight, everything looks better in the morning. Thanks anyway.

Sorry, I just saw your posts.  Really tired.  Much appreciation.

Images (of movie clips) used as background in the 3D viewport are primarily meant to be used as reference and will not render.
Here are a couple of alternatives:

Using the compositor

Add an Input>Movie Clip node, and use an alpha over node to compose the render layers over it.

For single images use an Input>Image node.

If you are using cycles make sure that you enable Film Transparent, so that the rendered layers render with a transparent background:
ver 2.8X and newer

(for ver 2.79 and earlier)

Without the compositor

Without using additional geometry or compositing, you can use the image as background for the world. Set the Texture coordinates to Window.

In this case disable Film>Transparent


Armature is only affected by one bone I'm having an issue with the simplest armature of one skull bone and two jaw bones. Each bone is paired by vertex to their meshes and the weight paint mode shows I have assigned the vertexes to the correct vertex group (Skull, OpenJaw.R and OpenJaw.L).
The issue is that when I try to pose the bones, only one bone of the three actually affect the mesh. I've re-paired the armature and mesh to try and fix this. The result was the 'working bone' became one of the other three bones. Now instead of the skull moving and the jaws staying completely still no matter how I posed the bones, only the right-side Jaw bone is moving and the others aren't affecting the mesh at all.
Thanks for your time

Solid objects can be parented directly to bones sans modifier.
In addition to @moonboot's answer am going to suggest a different route via separate objects and bone parenting, avoiding the need for the armature modifier and associated bone groups.
Since it is probably unlikely the "bone" objects are going to be deformed by the armature bones can parent directly to bones.
First step IMO would be to decimate the vert count, without a powerful computer the amount of verts in mesh will tend to make response slow.
Step 1.
Remove the armature modifier.
Make the bones all separate objects. For example sake just skull and jaw, but all teeth / eye-bones?? could be separate objects and parented accordingly. (to object or bone)

Selected all verts of skull P Selection to make the selection a different object. Now have an object each for skull and jaw.
Step 2.
In this example can see no reason to have a left and right jaw bone, so have merged into a sole jaw bone.

EDIT.

The jaw bone is halved to allow for a specific animation where the jaw
splits apart and fires a beam of energy between them.

In which case would keep the sole jaw bone, and make the two half bones children of it, each half of jaw object parented to the half bones.  In which case only need to animate jaw bone for regular mouth open close.

Notice the skull object is already parented to the skull bone.

Select the jaw object, then Shift select the armature and make the jaw bone active. CtrlP Bone. The jaw object is now parented to jaw bone.
Step 3
Parented the jaw bone to the skull bone. (Sounds like a song.) so if the skull is rotated the jaw comes along.

The jaw can be rotated relative to the skull.


Blender 2.81: Transfer rig to similar unrigged, unskinned model I have 2 models:
Model #1 is rigged and skinned and animated (with over 50 different animation fbx files):

Model #2 is not rigged and not skinned.

I would like to use the animations of Model #1 on Model #2.

I would need to adjust the bone positions so that it would work on model #2.

How could I transfer the rig of model #1 onto model #2?

Thank you.

I renamed the armature model1 to rig1. I suggest you adapt a naming system which differentiates between armature/rig objects and geometry/mesh objects.

Preparation

To better see the armature during the process, I select rig1, active In Front and choose Wire for the display as property. This way the rig is always visible in front in wireframe mode (less in the way but clearly visible).

Next I will create a T-Pose like action (take), to which I can always switch to if I modified some transformations.

Select the rig1.
Go into Pose Mode.
Select all bones. A
Clear all transformations. AltG, AltR, AltS
Press I to open up the Insert Keyframe Menu and choose LocRotScale to insert the appropriate keyframes.

Open up the dopesheet editor (1), and switch to the action editor (2) mode. Here you can see the keyframes we created with the I hotkey and also the action which was automatically created. Different actions can be stored independently from rigs in the blend. To preserve the action, even we do not need it, create a "fake user" for it (3) by clicking on the shield icon next to the action name. In the action dropdown, you can also see the other action Armature.001|Loco_Walk|BaseLayer which the other armature referers to.

I renamed both actions and made sure they both have fake users. With the  Rig selected, we can preview both actions by selecting them in the action editor. They have an F next to their name, if they have a fake user.

As both actions are protected now, I delete the unused additional armature.

Create the other armature

Select the armature rig1 and duplicate it by pressing ShiftD in the 3D Viewport. In the outliner, there will be the duplicated rig.001. Hide the original model and original rig, by clicking on the disable in viewport icon (TV symbol).

I rename the duplicated rig to rig2.

Briefly unhiding model1, I select model2 and position it as close as possible on top of the model1. I am in right orthographic view and eyeball the position while using the transform tools, G, R, S.

Then I go to the properties panel and open up the modifier section. We will use a data transfer modifier to transfer the weight groups from model1 to model2.

Select model2 and add a Data Transfer modifier to it.
Choose model1 as the source object (4).
Enable Vertex Data and Vertex Groups (5), then choose Nearest Face Interpolated as the transfer method. (6)
Make sure the evaluate in global space button is checked (7).

Clicking on Generate Data Layers (8) will generate the needed vertex groups.

If all vertex groups have been created, Apply (9) the data transfer modifier and hide the original model1.

The vertex weights have now been transferred to model2 and can be examined in Weight Paint mode.

Connect the armature

With the weights already transfered, we only need to connected armature. Select model2 and Shiftselect rig2 in the 3D Viewport. It is important that rig2 is the active object. Then press CtrlP/kbd> to open up the parent menu. Choose Set Parent To Armature Deform

This will parent model2 to rig2 and add an armature modifier.

model2 should now move if we assign the walk action to rig2 in the action editor.

This is how far transferring the weights and armature goes, since the object vary in their shape.

The next steps are

manually reposition bones of the rig2 armature in edit mode
correct the weights of model2 in weight paint mode
add new bones and new weights


What is needed to load/reload an addon during development? I wonder what is the best practice to develop an addon for blender on Linux.

To my understanding I need to place the python file that implements the addon
in ~/.config/blender/2.76/scripts/addon

In the content there needs to be the dict bl_info, containing some keys like "name", "category", ...
Also the functions register() and unregister() need to be there.

I have all this, but the addon is not shown in the list of addons, also after a refresh.

Is the location ~/.config/blender/2.76/scripts/addon not correct?

If I do changes to the file, how do i best get these changes into the running blender process?
I don't think I need to restart blender, each time I edit the addon source?

Why does the addon not get loaded?

The path should be ~/.config/blender/2.76/scripts/addons/, not addon.

  How do I best get addon changes into the running blender process?

F8 can be used to reload the addons.


How do I keep animation speed over multiple keyframes? So, let's say we have a "speed" of 6.918m per 20 frames.

6.918 is the movement distance in the top left of the GIF below - the movement occurs over 20 frames - hence, 6.918 metres per 20 frames.

Next, I would like to keyframe the object to continue moving 3 frames later, at the same speed.

For simplicity, let's presume I am using linear interpolation. To keep movement speed consistent, I would need to move the object by ((6.918 ÷ 20) × 3) =1.077 metres.

However:

I would like to be able to do this without using a calculator every time.
I would like to be able to make the object travel in a circle, figure of eight, or any hand-keyframed  movement I would like on any axis, at the same speed.
I would like to also be able to do this with rotations.

Therefore, my question is: How can I set a 'speed' for my object so that I am able to move and rotate it at a consistent rate across multiple keyframes?

For extra clarification, I would like to achieve this:

But without using a calculator, and moving the box on all 3 axis at once (notice in the gif I can only move the box on one axis at a time) by setting keyframes. Also to do something similar but with rotations.

Create a path using "poli" type curve
parent the cube to the curve
use path animation and choose the number of frame based on the path total length to get the desired speed

Note: check the Follow option so that the cube rotates along the curve


How to make an very extensive Squash and Stretch rig? I would like to make a rig that behaves like this: https://youtu.be/QHsrRRfE8VY?t=41

So a extensive rig, that has on top of that an extensive squash and stretch functionality.

Should I somehow parent everything to a bone with a Stretch To -constraint or something?

Yeah, I guess the universal stretch to -bone is one solution... maybe

With two stretchers it's way better, though:

Oh, but Bendy Bones might be even better for the main core rig.
This was an essential addon to make those bbones, then I just joined them together.

Oh yeah, progress:


procedurally generated mold (fungus) using voronoi texture? I have been trying to recreate a good looking procedural mold texture for a bit now.

I have found the best approach to creating the actual round shape of the mold patches seen in the pic seem to be utilizing the Voronoi texture as bump  and color in a principled shader, then using a mix shader with the Voronoi texture as factor to apply the mold over whatever material I want.

There are however 2 big problems I have run into, first problem is the colour, mold as shown in the picture remains a pretty solid color until the edge where it quickly fades to white, I have not found a way to give every individual cell this color composition.

The second problem I have is that I can't figure out how to increase the space between the cells to the extent that they are in the pic below.

If you feel that you know of a better or nicer way to replicate this than what I currently have please advise.

Mold in petri dish, note how the edges fade to white.

Your technique seems to be the most adequate for the illustrated effect, just needs some tweaking.

All you have to do is run your Voronoi texture through two Color Ramps, one for transparency and one for color.

Add two stops to each so you can control progression smoothly.

You can control "cluster size" from a black to white color ramp connected to the shader mix node.

You can also control color variation with a green to white ramp independently, making cells more or less greenish.

For cell spacing you have to adjust the Voronoi texture size, on the texture node itself. If you increase the size the cells will be bigger and more spread out, you will then have to manually adjust the two other color ramps to make each cell "tighter", otherwise it will just increase size, without creating bigger gaps.

If you want better control over the color of your mold, instead of directly using a Color Ramp from green to white for color, use a mask color ramp from black to white conected to a Color Mix node Factor socket, and you can then use any other textures for actual diffuse.


overweighted Automatic Rigging Issues Greeting fellow Artist.
i'm having trouble with automatic weight rigging. the mesh is a simple humanoid character. the bone is overweighted and effecting the vertex i don't want to(like shown in image).

i know i can always manually weight paint it or re-assign the vertex group. but that defeat the purpose of "automatic" rigging don't you think??

what i wanted to ask is : is there someway so that my device can understand what i needed just by clicking the "set parent with automatic weight" without further weight painting.
like any parameter i should change before assigning parent or any other way?

thanks in advance. sorry for bad english

Well, that's a normal behaviour. You can either add a bone to control the Neck part as WhovianBron3 suggested, or you manually fix it. The reason this happens is because the bone has high effect on this part of mesh because it is close enough to it.


Cannot edit vertices, edges or faces I cannot edit vertices, edges or faces because of the 3d cursor.
When in edit mode with the appropriate vertex, edge or face icon selected I try to click to select, say a vertex which I want to drag to resize and all I get is the 3D cursor which cancels the drag edit action.

You can change the mouse button with which you click in the Preferences/Input and change (select with) to Left, it is set to Right by default


Preview render selected renderlayer? is it possible to preview the selected renderlayer in the viewport?
I have a couple of renderlayers with override materials that I would like to check in the viewport, but it seems previewrender ignores renderlayers and material overrides completely...
Thanks

You can preview the current selected render layer by enabling Render Layer button located on 3D View header:


Eevee vs Cycles on tinted glass I made a test scene with a windowframe with glass, glass without a frame and a solid cube. Sun is the main light source with a little bit of HDRI lighting in the world settings. In cycles the tinted glass casts a colored shadow. In Eevee the tinted glas does not cast a colored shadow.

Next, you can see that in the Eevee image the cube casts the same shadow as the left glas plane. In Eevee I cannot set soft shadows for the glass in the light settings or the  render because that also blurs the shadow of the windowframe. So I can only do this in the material tab (or nodes) and that does not seem to work; glass shadows are either opaque or completely transparent. I used Princ BSDF and Transp BSDF with a mixed shader.

I have 2 questions:

Is it possible in Eevee to make tinted glass cast a colored shadow just like in cycles?
How do I set the glass shadow soft (but transparent) while keeping the window frame shadow opaque in Eevee?

Cycles:

Eevee:

Pretty easy faking colored caustics in cycles mixing a transparent shader and a Glass/Principled Shader with these nodes.

However that trick does not work in EEVEE

You could create it by using a color ramp on the surface material or a projection of color on the shadow if it's a still image it's a crude hack that changes the surface instead.
like this:

This trick maps the shadow area to a different color.