Jag har ett objekt och två punkter som jag behöver för att rotera hela objektet runt. Jag skapade två tömningar för rotationspunkterna och jag måste rotera den runt en axel som bildas av linjen mellan de två tömningarna. Jag försökte lägga till objektbegränsningar till ingen nytta. I bilden nedan måste jag rotera triangeln runt den röda linjens axel.
Kommentarer
- Liknar en annan fråga. Du kan prova på det här sättet .
- Eftersom jag ställde den här frågan introducerade Blender 2.8 detta som en riktig, lättillgänglig funktion. Bläddra ner förbi de gamla svaren för den enkla lösningen. (Don ’ Förresten röstar inte gamla svar – de är användbara för alla som använder en äldre version av Blender.)
Svar
Vi har flera transformorienteringar tillgängliga i 3D-vyn som avgör vilket sätt ett objekt rör sig längs en given axel.
När dessa alternativ inte passar uppgiften kan du definiera en anpassad orientering Det här alternativet finns i egenskapssidfältet N
För att uttrycka det helt enkelt, om du lägger till ett objekt och roterar det 23,6 grader på z-axeln och sedan använder det för att definiera en anpassad orientering, kan du sedan använda den orienteringen för att flytta, rotera eller skala ett annat objekt längs samma x- och y-axel som kommer att vid 23,6 grader från världens x- och y-axel.
För att använda detta när du har två tömningar på plats –
- Välj ett emp ty och tryck på Shift S och välj Markör till Vald.
- Lägg till ett plan och skala till noll på x-axeln ( S X 0 Enter ).
- Aktivera snapping till vertex i 3D-rubriken.
- Se till att vyn är inriktad mot en förinställning (vänster, topp, front …) som tittar rakt på de två tömmarna så att den enda vinkeln mellan två är den vinkel du vill definiera. Om du vill definiera en orientering som ändrar mer än en axel kan du upprepa nästa steg flera gånger från tre vyer för att få justeringen rätt.
- Börja rotera planet R och flytta markören över den andra tomma. När en cirkel visas runt mitten av det tomma som visar att den snäpper till den, acceptera rotationen. Rotation av planet kommer nu att matcha vinkeln mellan de två tömningarna.
- Visa egenskaperna sidofältet och hitta panelen Transform Orientations, skapa en ny orientering genom att klicka på .
Planet kan nu raderas och den nya transformeringsriktningen kan användas för att flytta eller rotera andra objekt längs en axel som löper parallellt med en linje mellan de två tömningarna .
När en anpassad orientering väljs X X , Y Y och Z Z genvägar som normalt används för att flytta på den lokala axeln använder den anpassade axeln istället för den lokala axeln.
Svar
Det finns faktiskt inget behov av att skapa de två tömningarna om du bara ska bilda en imaginär axel. Jag tror att den relativt enkla och snabba åtgärden här skulle vara:
Om du vill göra i Redigeringsläge :
- Markera alla element du vill rotera, håll sedan Skift och klicka två gånger på den kanten för att göra den aktiv;
- Alt . (period), Shift Numpad 1 ;
- R för att rotera som du vill, sedan Enter . Klar.
Om du vill göra i Objektläge:
- Välj ett eller flera objekt, se till att målobjektet har valts senast. Välj målkanten i Redigera -läge;
- Shift S Markör till vald, . (period), Shift Numpad 1 ;
- Tillbaka till Objekt -läge, R för att rotera, Enter . Klar.
–
PS: Naturligtvis kan du trycka på Alt Mellanslag för att visa som Normal koordinatsystem för enkel bedömning, eller CtrlAlt Mellanslag för att skapa / lagra en ny transformationsorientering baserad på den för vidare användning, precis som andra nämner. Jag vill bara föreslå det snabbaste och exakta sättet.
Kommentarer
- För dem som inte vet ’,
Alt+.
ändrar ledpunkten till det aktiva elementet. Du kan se de andra pivotalternativen på menyn bredvid skuggningsalternativen.
Svar
Manuellt sätt
Välj först en av tömningarna och tryck på SKIFT + S Cursor to Selected
.
och sedan MMB för att rotera vyn tills de två tömningarna står i linje.
Klicka nu på . (period) för att ställa in svängpunkten till 3D-markören. Välj slutligen objektet och tryck R för att rotera.
Pythonic Way
Detta skript använder vektorn mellan de två tömningarna och rotation runt 3D-markören .
import bpy from mathutils import Vector def main(): C = bpy.context D = bpy.data #rotation set to 90 degrees (rotation in radians) rotation = (6.283185/4) #Save objects by their presumed names empty0 = D.objects["Empty"] empty1 = D.objects["Empty.001"] object_to_rot = D.objects["Suzanne"] #################################################### #set pivot point to be one of the empties by temporarily placing cursor there #use of Vector() here is to avoid copying reference to cursor location old_cursor_loc = Vector(CursorAccess.getCursor()) CursorAccess.setCursor( empty0.location ) CursorAccess.findSpace().pivot_point = "CURSOR" #make object the active object C.scene.objects.active = object_to_rot #get axis we rotate around rotation_axis = empty1.location - empty0.location #override the rotate operator override = get_override("VIEW_3D", "WINDOW") bpy.ops.transform.rotate( override, value=rotation, axis=rotation_axis ) #restore old cursor position CursorAccess.setCursor( old_cursor_loc ) def get_override(area_type, region_type): """Returns a dictionary which can be used to override certain bpy operators""" for area in bpy.context.screen.areas: if area.type == area_type: for region in area.regions: if region.type == region_type: override = {"area": area, "region": region} return override #error message if the area or region wasn"t found raise RuntimeError("Wasn"t able to find", region_type," in area ", area_type, "\n Make sure it"s open while executing script.") class CursorAccess: """This code allows you to set and get the cursor location. It came from the addon Cursor Control http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/3D_interaction/Cursor_Control""" @classmethod def findSpace(cls): area = None for area in bpy.data.window_managers[0].windows[0].screen.areas: if area.type == "VIEW_3D": break if area.type != "VIEW_3D": return None for space in area.spaces: if space.type == "VIEW_3D": break if space.type != "VIEW_3D": return None return space @classmethod def setCursor(cls,coordinates): spc = cls.findSpace() spc.cursor_location = coordinates @classmethod def getCursor(cls): spc = cls.findSpace() return spc.cursor_location if __name__=="__main__": main()
Svar
Du kan göra detta med Mesh Align Plus (mitt tillägg). Antingen titta på stegen i GIF eller läs textversionen nedan (jag spelade in den inställning du beskrev ovan och sedan ett par mer generaliserade exempel om du vill göra något liknande):
Funktionen du letar efter är snabbaxeln Rotera operatören i 3D-vy Verktygspanelen (T)> Mesh Align Plus-fliken i sin egen panel.
-
Välj en målaxel i redigeringsläge (Tab) genom att använda Skift + högerklicka för att välja de två kantverterna (lämna dem markerade och se till att Auto Grab Source är markerat, det är som standard)
-
Skriv in vinkeln som ska roteras med för Belopp och med objektet du vill använda rotation till markerad, tryck Använd på: Objekt
Svar
Välj en målaxel (kant) i redigeringsläge.
Snäpp 3D-markören till vald kant ( Shif t + S och klicka Markör till vald ).
Ställ in 3D-markören som svängpunkt ( tangentbordets periodknapp ).
Öppna Egenskaper hyllan N och gå till utrullningen Tranfsorm Orientation längst ner på panelen.
Klicka på ”plus” -knappen för att skapa en ny transformeringsorientering (eller tryck på Ctrl + Alt + Mellanslag ) .
Se till att skapad orientering är aktiv.
Nu kan du rotera runt den kanten genom att trycka på R och Y + Y (längs den lokala Y-axeln på den givna kanten).
Svar
Blender 2.8+
Detta är mycket enklare i senaste versioner av Blender.
I redigeringsläget väljer du dina två punkter (i Vertex Select -läge) eller din kant (i Edge Select -läge).
Öppna Transform Orientation popover:
Klicka sedan på Skapa riktning ” + ” -knapp:
Detta skapar en anpassad transformeringsorientering, troligen med namnet ” Edge ” som standard för dig. Se till att den är vald när du vill använda den, eller byt tillbaka till standardinställningen Global när du är klar. Du kan också radera den anpassade transformeringsriktningen med ” X ” bredvid dess namn:
När din anpassade transformeringsorientering är aktiv, du kan rotera längs dess Y-axel med R Y eller använda Rotera gizmo:
Svar
Jag gillar inte de befintliga svaren. Först säger jag varför. Sedan kommer jag att erbjuda min egen lösning.
För det första är det inte något som tillägg krävs för, och att installera tillägg när det kan göras är helt enkelt inte nödvändigt.
För det andra ger rotation runt svängpunkter underlig interpolering när den används i en animation. Anledningen till det är att det inte är rak rotation utan en kombination av rotation och översättning. Det finns tider att det kommer att fungera bra, beroende på lokala axlar, men gånger att det kommer att fungera förvirrande fel.
För det tredje kan rotation kring godtyckliga axlar också ge konstig interpolering när du använder Euler-vinklar (och frånvaron av ben i dina bilder tyder på att du använder Euler-vinklar för dina omvandlingar.) Att rotera kring godtyckliga axlar när du använder Euler-vinklar kan också ge dig förvirrande konstighet – bäst demonstreras av ” rubiks kub ” animationer.
Så, vad är den lösning jag förespråkar? I grund och botten vad du började med, men inte kunde avsluta: ett par tömningar och begränsningar. Börja med det tömningspar du har, en vid endera punkten som definierar din axel. Ingenting är föräldraskap än. Ge sedan en tom en dämpad spåra inriktning på den andra tomma. Slutligen, föräldra objektet som du vill rotera till det begränsade tomma. För att rotera objektet, rotera föräldern tomt i sin lokala Y-axel. (Du kanske vill ge detta tömmer transformeringslås för att förhindra rotation i andra axlar och möjligen översättning / skala; du kanske också vill ställa in deltor för det.)
Detta kräver inga tillägg, med endast standardblenderverktyg och ger dig bra interpolering oavsett omvandlingsläge och axlar, för hela din rotation kommer att ligga i en lokal axel av din tomma.