Python 如何使球体的中心保持在实际中心
这是一个棘手的问题,我制作了一个小程序:Python 如何使球体的中心保持在实际中心,python,vector,3d,pygame,Python,Vector,3d,Pygame,这是一个棘手的问题,我制作了一个小程序: import pygame as pg from math import * import os import sys vec2 = pg.math.Vector2 vec3 = pg.math.Vector3 os.environ["SDL_VIDEO_CENTERED"] = "1" width = 1000 height = 800 thickness = 2 pg.init() screen = pg.display.set_mode((w
import pygame as pg
from math import *
import os
import sys
vec2 = pg.math.Vector2
vec3 = pg.math.Vector3
os.environ["SDL_VIDEO_CENTERED"] = "1"
width = 1000
height = 800
thickness = 2
pg.init()
screen = pg.display.set_mode((width, height))
clock = pg.time.Clock()
def p5map(n, start1, stop1, start2, stop2):
return ((float(n)-start1)/(stop1-start1))*(stop2-start2)+start2
def sphere(radius, point, xrot, yrot, yoffset):
for i in xrange(point):
lon = p5map(i, 0, point, -pi, pi)
for j in xrange(point):
lat = p5map(j, 0, point, -pi/2, pi/2)
x = int(radius * sin(lon) * cos(lat)) + width/2
y = int(radius * sin(lon) * sin(lat)) + height/2 + yoffset
z = int(radius * cos(lon))
pos = vec3(x,y,z)
alpha = int(p5map(z, -radius, radius, 0, 255))
pos.rotate_x_ip(xrot)
pos.rotate_y_ip(yrot)
x = int(pos.x)
y = int(pos.y)
screen.set_at((x, y), (0,0,0, alpha))
def run():
running = True
point = 100
radius = 300
yoffset = 0
xangle = 0
yangle = 0
while running:
clock.tick(0)
mouse_pos = vec2(pg.mouse.get_pos())
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
pg.quit()
sys.exit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
running = False
pg.quit()
sys.exit()
if event.key == pg.K_UP:
yoffset += -50
if event.key == pg.K_DOWN:
yoffset += 50
if event.key == pg.K_w:
xangle += 10
print xangle
if event.key == pg.K_s:
xangle += -10
print xangle
if event.key == pg.K_a:
yangle += 10
print yangle
if event.key == pg.K_d:
yangle += -10
print yangle
pg.display.set_caption("{:.2f}".format(clock.get_fps()))
screen.fill((255, 255, 255))
sphere(radius, point, xangle, yangle, yoffset)
pg.display.flip()
run()
你可以用“wasd”键旋转球体,你会很快遇到问题;球体不能保持居中,它甚至可以离开屏幕!
以下是球体如何旋转的示例:
它应该这样做:
看看第一个例子中它是如何不居中的?我如何修复它,使其保持居中
球体本身不旋转,而是围绕屏幕上的0,0,0点旋转。如果有人知道我做错了什么,我想听听
球体旋转(120度)的另一个示例:
以及它应该如何(用手固定):不管怎样,我在球函数中找到一个解:
def sphere(radius, point, xrot, yrot, yoffset):
for i in xrange(point):
lon = p5map(i, 0, point, -pi, pi)
for j in xrange(point):
lat = p5map(j, 0, point, -pi/2, pi/2)
x = int(radius * sin(lon) * cos(lat))# + width/2
y = int(radius * sin(lon) * sin(lat))# + height/2 + yoffset
z = int(radius * cos(lon))
pos = vec3(x,y,z)
alpha = int(p5map(z, -radius, radius, 0, 255))
pos.rotate_x_ip(xrot)
pos.rotate_y_ip(yrot)
x = int(pos.x)
y = int(pos.y)
x += width/2
y += height/2
screen.set_at((x, y), (0,0,0, alpha))
我注释掉了+width/2和+height/2(即偏移量),并在旋转后应用偏移量