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(即偏移量),并在旋转后应用偏移量