Jeg har et objekt og to punkter jeg trenger for å rotere hele objektet. Jeg opprettet to tømninger for rotasjonspunktene, og jeg må rotere den rundt en akse dannet av linjen mellom de to tømmene. Jeg prøvde å legge objektbegrensninger til ingen nytte. På bildet nedenfor må jeg rotere trekanten rundt aksen til den røde linjen.
Kommentarer
- Ligner på et annet spørsmål. Du kan prøve på denne måten .
- Siden jeg stilte dette spørsmålet, introduserte Blender 2.8 dette som en skikkelig, lett tilgjengelig funksjon. Bla ned forbi de gamle svarene for å få den enkle løsningen. (Ikke ‘ For øvrig nedstemte gamle svar – de er nyttige for alle som bruker en eldre versjon av Blender.)
Svar
Vi har flere transformasjonsretninger tilgjengelig i 3D-visningen som bestemmer hvilken vei et objekt beveger seg langs en gitt akse.
Når disse alternativene ikke passer til oppgaven, kan du definere en tilpasset retning Dette alternativet er tilgjengelig i egenskapssidefeltet N
For å si det ganske enkelt, hvis du legger til et objekt og roterer det 23,6 grader på z-aksen og deretter bruker det til å definere en egendefinert retning, kan du deretter bruke denne retningen til å flytte, rotere eller skalere et annet objekt langs samme x- og y-aksen som vil være ved 23,6 grader fra verdens x- og y-akse.
For å bruke dette når du har to tømmer på plass –
- Velg ett emp ty og trykk Shift S og velg Markør til valgt.
- Legg til et plan og skaler til null på x-aksen ( S X 0 Enter ).
- Aktiver snapping til toppunkt i 3D-overskriften.
- Forsikre deg om at visningen er justert til en forhåndsinnstilling (venstre, topp, front …) som ser rett på de to tømmes slik at den eneste vinkelen mellom to er vinkelen du vil definere. Hvis du ønsker å definere en retning som endrer mer enn en akse, kan du gjenta neste trinn flere ganger fra tre visninger for å få justeringen riktig.
- Begynn å rotere planet R og flytt markøren over den andre tomme. Når en sirkel vises rundt midten av det tomme som viser at den snapper til den, aksepterer du rotasjonen. Rotasjonen av planet vil nå matche vinkelen mellom de to tømmene.
- Vis sidefeltet for egenskaper og finn Transform Orientations-panelet, opprett en ny retning ved å klikke på .
Flyet kan nå slettes, og den nye transformasjonsorienteringen kan brukes til å bevege eller rotere andre objekter langs en akse som går parallelt med en linje mellom de to tømmene .
Når en tilpasset retning er valgt, X X , Y Y og Z Z snarveier som vanligvis brukes til å bevege seg på den lokale aksen, bruker den tilpassede aksen i stedet for den lokale aksen.
Svar
Det er faktisk ikke nødvendig å opprette de to tømmene hvis du bare skal danne en imaginær akse. Jeg tror den relativt enkle og raske operasjonen her vil være:
Hvis du vil gjøre i Redigeringsmodus :
- Velg alle elementene du vil rotere, hold deretter Shift og klikk på kanten to ganger for å gjøre den aktiv;
- Alt . (periode), Shift Numpad 1 ;
- R for å rotere som du vil, deretter Enter . Ferdig.
Hvis du vil gjøre i Objektmodus:
- Velg ett eller flere objekter, sørg for at målobjektet er valgt sist. Velg målkanten i Rediger -modus;
- Shift S Markør til valgt, . (periode), Shift Numpad 1 ;
- Tilbake til Objekt -modus, R for å rotere, Enter . Ferdig.
–
PS: Selvfølgelig kan du trykke Alt Mellomrom for å vise som Normal koordinatsystem for enkel vurdering, eller CtrlAlt Mellomrom for å lage / lagre en ny transformasjonsorientering basert på den for videre bruk, akkurat som andre nevner. Jeg vil bare foreslå den raskeste og nøyaktige måten.
Kommentarer
- For de som ikke vet ‘ ikke vet,
Alt+.
endrer pivotpunktet til det aktive elementet. Du kan se de andre pivotalternativene på menyen rett ved siden av skyggealternativene.
Svar
Manuell måte
Velg først en av tømmene og trykk SKIFT + S Cursor to Selected
.
og deretter MMB for å rotere visningen til de to tømmene stiller seg opp.
Nå, trykk på . (periode) for å sette dreiepunkt til 3D-markøren. Til slutt velger du objektet og trykker R for å rotere.
Pythonic Way
Disse skriptene bruker vektoren mellom de to tømmene og rotasjon rundt 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 gjøre dette med Mesh Align Plus (tillegget mitt). Enten se trinnene i GIF eller lese tekstversjonen nedenfor (jeg spilte inn oppsettet du beskrev ovenfor, og deretter et par mer generaliserte eksempler i tilfelle du vil gjøre noe lignende):
Funksjonen du leter etter er Quick Axis Roter operatøren i 3D-visning Verktøypanel (T)> Mesh Align Plus-fanen , i sitt eget panel.
-
Velg en målakse i redigeringsmodus (Tab) ved å bruke Shift + høyreklikk for å velge de to kantvertene (la dem være valgt, og sørg for Auto Grab Source er merket, det er som standard)
-
Skriv inn vinkelen som skal roteres med for Beløp , og med objektet du vil bruke rotasjon til valgt, trykk Bruk på: Objekt
Svar
Velg en målakse (kant) i redigeringsmodus.
Fest 3D-markøren til den valgte kanten ( Shif t + S og klikk Markør til valgt ).
Sett 3D-markøren som pivotpunkt ( tastaturperiodeknapp ).
Åpne Egenskaper hyllen N og gå til utrullingen Tranfsorm Orientation nederst på panel.
Klikk på «pluss» -knappen for å opprette ny transformasjonsretning (eller trykk Ctrl + Alt + Mellomrom ) .
Forsikre deg om at opprettet retning er aktiv.
Nå kan du rotere rundt den kanten ved å trykke R og Y + Y (langs den lokale Y-aksen til den gitte kanten).
Svar
Blender 2.8+
Dette er langt enklere i nylige Blender-utgivelser.
I redigeringsmodus velger du de to punktene dine (i Vertex Select mode) eller edge (i Edge Select mode).
Åpne Transform Orientation popover:
Klikk deretter på Opprett retning » + » -knapp:
Dette skaper en tilpasset transformasjonsorientering, sannsynligvis kalt » Edge » som standard for deg. Forsikre deg om at den er valgt når du vil bruke den, eller bytt tilbake til standardverdien for Global når du er ferdig. Du kan også slette den tilpassede transformasjonsorienteringen med » X » ved siden av navnet:
Når den tilpassede transformasjonsorienteringen er aktiv, du kan rotere langs Y-aksen med R Y eller bruke Roter gizmo:
Svar
Jeg liker ikke de eksisterende svarene. Først vil jeg fortelle deg hvorfor. Så vil jeg tilby min egen løsning.
For det første er dette ikke noe som kreves for noen tillegg, og installering av tillegg når det kan gjøres er ikke nødvendig.
For det andre gir rotasjon rundt dreiepunkter merkelig interpolasjon når den brukes i en animasjon. Årsaken til det er fordi det ikke er rett rotasjon, men en kombinasjon av rotasjon og oversettelse. Det er tider at det vil fungere bra, avhengig av lokale akser, men ganger at det vil fungere forvirrende feil.
For det tredje kan rotasjon rundt vilkårlige akser også gi underlig interpolasjon når du bruker Euler-vinkler (og fraværet av bein i bildene dine antyder at du bruker Euler-vinkler for dine transformasjoner.) Å rotere rundt vilkårlige akser når du bruker Euler-vinkler, kan også gi deg forvirrende rarhet – best demonstrert av » rubiks kube » animasjoner.
Så, hva er løsningen jeg anbefaler? I utgangspunktet hva du startet med, men ikke klarte å fullføre: et par tømninger og begrensninger. Begynn med det tømmeparet du har, en på begge punktene som definerer aksen din. Ingenting er foreldret ennå. Neste, gi en tom en dempet spor målrettet mot den andre tomme. Til slutt, foreldre objektet du vil rotere til det begrensede tomme. For å rotere objektet, roter foreldren tomt i den lokale Y-aksen. (Det kan være lurt å gi dette tømmer transformeringslås for å forhindre rotasjon i andre akser og muligens oversettelse / skala; det kan også være lurt å sette deltas for det.)
Dette krever ingen tillegg, ved å bruke bare standard Blender-verktøy, og gir deg god interpolering uavhengig av transformasjonsmodus og akser, fordi hele rotasjonen din vil være i en lokal akse for den tomme.