SceneKit - Удалить линию сшивания в границах краев

Я показываю текстуру на кубе (см. SceneKit - сопоставление текстуры куба с блоком) Теперь все работает хорошо, но результат показывает светлую линию стыка между некоторыми гранями куба, которые я здесь обрисовал (вы внутри куба):

введите здесь описание изображения

Есть идеи, как мне от этого избавиться? Входная текстура выглядит как

введите здесь описание изображения

Таким образом, во вводе есть некоторая нестабильность. Я использую настраиваемую геометрию SceneKit, которая не делает ничего, кроме сопоставления этой текстуры с кубом. Вы можете найти соответствующий код, упомянутый выше: https://stackoverflow.com/a/38961244/2054629


person Guig    schedule 15.08.2016    source источник


Ответы (1)


В качестве хакерского решения я изменил геометрию куба, чтобы он был немного не кубическим и больше напоминал введите описание изображения здесь

Чтобы края исчезли (при условии, что камера внутри). В результате текстура немного обрезается, но это гораздо менее заметно.

Я обычно определял положение вершин 3 x 8 как:

let _positions = [
  SCNVector3(x:-halfSide, y:-halfSide, z:  halfSide),
  SCNVector3(x: halfSide, y:-halfSide, z:  halfSide),
  SCNVector3(x:-halfSide, y:-halfSide, z: -halfSide),
  SCNVector3(x: halfSide, y:-halfSide, z: -halfSide),
  SCNVector3(x:-halfSide, y: halfSide, z:  halfSide),
  SCNVector3(x: halfSide, y: halfSide, z:  halfSide),
  SCNVector3(x:-halfSide, y: halfSide, z: -halfSide),
  SCNVector3(x: halfSide, y: halfSide, z: -halfSide),
]
let positions = _positions + _positions + _positions

и теперь я заменяю последнюю строку на:

let X = 0
let Y = 8
let Z = 16
func killEdgeStitching(positions: [SCNVector3], axis: Int) -> [SCNVector3] {
  var res = [SCNVector3]()
  let delta = Float(0.99)
  for pos in positions {
      var newPosition = SCNVector3(x: pos.x, y: pos.y, z: pos.z)
      switch axis {
      case X:
          newPosition.x *= delta
      case Y:
          newPosition.y *= delta
      default:
          newPosition.z *= delta
      }
      res.append(newPosition)
  }
  return res
}
let positions = killEdgeStitching(positions: _positions, axis: X) +
  killEdgeStitching(positions: _positions, axis: Y) +
  killEdgeStitching(positions: _positions, axis: Z)

Я оставлю это там, но, надеюсь, у кого-то будет реальный ответ!

person Guig    schedule 15.08.2016