处理中的3D SVG动画——闪烁问题,SVG加载问题

7
我正在尝试制作一个时光地理推特可视化,灵感来自于Jer Thorp的"Just Landed"。我正在使用processing的最新版本。
我正在使用SVG图像作为我的地图,因为我希望能够以任意角度缩放地图,聚焦于某些地方,然后在全球范围内显示推特连接。我遇到了几个问题,其中第一个是当我旋转我的地图时,国家的路径边界会闪烁。这是我的问题截图:

这是导致问题的代码:

import processing.opengl.*;
import java.awt.event.*;

PShape map;
PShape test1;
PShape test2;

//camera position/movement intialization
PVector position = new PVector(450, 450);
PVector movement = new PVector();
PVector rotation = new PVector();
PVector velocity = new PVector();

float rotationSpeed = 0.035;
float panningsSpeed = 0.035;
float movementSpeed = 0.05;
float scaleSpeed = 0.25;
float fScale = 2;

void setup(){
  map = loadShape("blank_merc.svg"); //swap out for whatever file
  size(900, 900, OPENGL);
  smooth();
  fill(150, 200, 250);
  addMouseWheelListener(new MouseWheelListener(){
    public void mouseWheelMoved(MouseWheelEvent mwe){
      mouseWheel(mwe.getWheelRotation());
    }
  }); 
}

void draw(){
  if (mousePressed) {
    if (mouseButton==LEFT) velocity.add( (pmouseY-mouseY) * 0.01, (mouseX-pmouseX) * 0.01, 0);
    if (mouseButton==RIGHT) movement.add( (mouseX-pmouseX) * movementSpeed, (mouseY-pmouseY) * movementSpeed, 0);
  }
  //TODO: implement reset functionality: DONE
  if (keyPressed){
    if (key=='r'){
      position.set(450,450);
      rotation.sub(rotation.get());
      velocity.sub(velocity.get());
      movement.sub(movement.get());
    }
  }
  velocity.mult(0.95);
  rotation.add(velocity);
  movement.mult(0.95);
  position.add(movement);

  background(255);
  //lights();




  translate(position.x, position.y, position.z);
  rotateX(rotation.x*rotationSpeed);
  rotateY(rotation.y*rotationSpeed);
  scale(fScale);

  shape(map,-250,-250,1000,1000);

}

void mouseWheel(int delta){
  fScale -= delta * scaleSpeed;
  fScale = max(0.5, fScale);
}

我被告知这可能是路径之间的z-fighting问题,我认为这可能是问题所在,因为当地图处于中旋转状态时,闪烁问题更加严重,特别是在与视平面非正交的角度上。我试图通过使用“translate”命令在Z方向上微调文件的PShape子对象来解决这个问题,但是我收到了错误提示:“illegal argument exception: cannot use translate(x,y,z) on a PMatrix2D”。
我还遇到了测试我的代码与其他SVG地图文件以及使SVG看起来像我认为的那样的困难。我的SVG地图上有很多城市和其他奇怪的标记,即使我从wikimedia commons下载完全“空白”的svg世界地图墨卡托投影。在处理渲染中出现了这些城市标记/区域属性,而在浏览器视图中则没有显示。我正在尝试找出如何在Inkscape中“清理”我的SVG文件,但我不确定具体要查找什么。
例如,我已经使用了这张地图来运行它:http://commons.wikimedia.org/wiki/File:Mercator_Projection.svg,但是我不需要其中的点和线条,我不得不手动选择并删除路径,这不是一个非常彻底的过程。当我使用this地图时,它应该是上面的“空白版本”,没有所有的标记,但我看到不仅有一堆标记(可能在SVG XML中用某些样式属性隐藏?),还有这种奇怪的垂直条纹,我的摄像机控制非常缓慢。该应用程序似乎表现得好像文件太大了,但只有2MB左右。以下是这种情况的屏幕截图:

enter image description here

我只是想找到一个方法将“干净”的SVG世界地图导入Processing,以便我可以旋转和放大它,如果我能做到这一点,我就可以开始绘制弧线部分。我真诚地感激任何人提供的帮助。
谢谢。

嗯,不太确定如何回应这种情况-但我点了赞你的问题,因为它是清晰而周到的!您是否尝试在Processing论坛上发布?我知道Jer的那个代码片段,但我没有尝试加载SVG的经验... - jesses.co.tt
感谢您的点赞。是的,我在Processing论坛上发布了这个问题,但由于这里的流量更高,我认为我更有可能在这里得到答案。以下是我在那里发布的帖子,其中包含这里无法包含的图片:http://forum.processing.org/two/discussion/1223/3d-svg-animation-flickering-problems-svg-loading-questions - INVIZIBILITY
1个回答

1
如果我正确理解您的问题,闪烁只出现在边缘,可能是它们重叠的地方。这似乎是深度冲突引起的问题。通常,最好在主绘图之外进行简单测试,以快速查看正在发生什么以及如何修复它。
如果您制作一个简单的SVG,其中有两个重叠的形状,共享一个边缘,会发生同样的事情吗?
如果是这样,我认为最简单的解决方案(尽管不太容易)是:
- 在Illustrator中选择所有国家 - 使用 “对象>转换>缩放…” 并缩小一点点
然后分享您修复后的地图给其他人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接