【问题标题】:3d rendering error whilst looking backwards向后看时出现 3d 渲染错误
【发布时间】:2021-11-24 03:30:49
【问题描述】:

几天前我用python(乌龟)做了一个3d体素渲染引擎。一切似乎都很顺利,直到你在一个物体面前转身 360 度∘。对象将在 y 轴上镜像显示。我通过设置您的 y 旋转来解决它,但该修复仅适用于一个视角。没有任何控制台错误,因此我无法确定呈现错误的位置。我希望我有更多信息来帮助定位问题。

from turtle import*
from time import*
from math import*
wn=Screen()
speed(0)
ht()
pu()
wn.tracer(0,0)
fov=200
xoff=0
yoff=0
zoff=0
camx=0
camy=0
camz=-105
xrot=0
yrot=0
zrot=0
jvel=0
onground=False
def goto3d(x,y,z):
  rotxx=x
  rotxy=y*cos(xrot)-z*sin(xrot)
  rotxz=y*sin(xrot)+z*cos(xrot)
  rotyx=rotxx*cos(yrot)+rotxz*sin(yrot)
  rotyy=rotxy
  rotyz=rotxz*cos(yrot)-rotxx*sin(yrot)
  rotzx=rotyx*cos(zrot)-rotyy*sin(zrot)
  rotzy=rotyx*sin(zrot)+rotyy*cos(zrot)
  rotzz=rotyz
  transx=rotzx-xoff
  transy=rotzy-yoff
  transz=rotzz-zoff
  newx=fov*transx/transz
  newy=fov*transy/transz
  if newx<=-200 or newy<=-200 or newx>=200 or newy>=200:
    pencolor('black')
  else:
    goto(newx,newy)
def cube(x,y,z):
  z-=100
  pu()
  goto3d((-1+x)-camx,(-1+y)-camy,(-1+z)-camz)
  pd()
  goto3d((-1+x)-camx,(1+y)-camy,(-1+z)-camz)
  goto3d((1+x)-camx,(1+y)-camy,(-1+z)-camz)
  goto3d((1+x)-camx,(-1+y)-camy,(-1+z)-camz)
  goto3d((-1+x)-camx,(-1+y)-camy,(-1+z)-camz)
  pu()
  goto3d((-1+x)-camx,(1+y)-camy,(-1+z)-camz)
  pd()
  goto3d((-1+x)-camx,(1+y)-camy,(1+z)-camz)
  goto3d((1+x)-camx,(1+y)-camy,(1+z)-camz)
  goto3d((1+x)-camx,(1+y)-camy,(1+z)-camz)
  goto3d((1+x)-camx,(1+y)-camy,(-1+z)-camz)
  pu()
  goto3d((-1+x)-camx,(-1+y)-camy,(-1+z)-camz)
  pd()
  goto3d((-1+x)-camx,(-1+y)-camy,(1+z)-camz)
  goto3d((1+x)-camx,(-1+y)-camy,(1+z)-camz)
  goto3d((1+x)-camx,(-1+y)-camy,(1+z)-camz)
  goto3d((1+x)-camx,(-1+y)-camy,(-1+z)-camz)
  pu()
  goto3d((-1+x)-camx,(1+y)-camy,(1+z)-camz)
  pd()
  goto3d((-1+x)-camx,(-1+y)-camy,(1+z)-camz)
  pu()
  goto3d((1+x)-camx,(1+y)-camy,(1+z)-camz)
  pd()
  goto3d((1+x)-camx,(-1+y)-camy,(1+z)-camz)
def black():
  pencolor('black')
  pu()
  goto(-400,-400)
  pd()
  begin_fill()
  goto(-200,200)
  goto(200,200)
  goto(200,-200)
  end_fill()
def w():
  global camz
  global camx
  camz+=.3*cos(yrot)
  camx+=-1*.3*sin(yrot)
def a():
  global camz
  global camx
  camz+=-1*.3*sin(yrot)
  camx+=-1*.3*cos(yrot)
def s():
  global camz
  global camx
  camz+=-1*.3*cos(yrot)
  camx+=.3*sin(yrot)
def d():
  global camz
  global camx
  camz+=.3*sin(yrot)
  camx+=.3*cos(yrot)
def left():
  global yrot
  yrot+=pi/50
def right():
  global yrot
  yrot-=pi/50
def jump():
  global jvel
  if onground==True:
    jvel=.3
wn.onkey(w,'w')
wn.onkey(a,'a')
wn.onkey(s,'s')
wn.onkey(d,'d')
wn.onkey(left,'Left')
wn.onkey(right,'Right')
wn.onkey(jump,'Space')
wn.listen()
def bush(x,y,z):
  pencolor('darkgreen')
  cube(0+x,0+y,0+z)
  cube(2+x,0+y,0+z)
  cube(2+x,2+y,0+z)
def tree(x,y,z):
  pencolor('brown')
  cube(0+x,0+y,0+z)
  cube(0+x,2+y,0+z)
  pencolor('green')
  cube(0+x,4+y,0+z)
  cube(0+x,6+y,0+z)
  cube(2+x,4+y,0+z)
  cube(-2+x,4+y,0+z)
  cube(0+x,4+y,2+z)
  cube(0+x,4+y,-2+z)
def render():
  bush(-5,0,10)
  tree(3,0,7)
while True:
  clear()
  black()
  render()
  update()
  jvel-=.01
  camy+=jvel
  if camy<=0:
    camy=0
    jvel=.01
    onground=True
  if camy>=.3:
    onground=False

【问题讨论】:

    标签: python 3d python-turtle


    【解决方案1】:

    您没有剔除位于相机后面的顶点。我在您的代码中看不到任何剔除的证据。如果您渲染位于相机后面的点,它将在结果中颠倒显示。你实际上不是在转动 360 度,而是 180 度。当体素直接在您身后时,如果您不剔除它,它们将出现倒置。您可以通过打印yrot 变量来测试它。尝试修改if newx&lt;=-200 or newy&lt;=-200 or newx&gt;=200 or newy&gt;=200 行以包含transz 的检查,即if transz &lt; 0.1 or newx&lt;=-200 or newy&lt;=-200 or newx&gt;=200 or newy&gt;=200。任何小的值都可以,但 0.1 在您当前的实现中应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2019-10-18
      • 2016-03-29
      • 1970-01-01
      相关资源
      最近更新 更多